OpenGL правоъгълникът се преоразмерява с един пиксел произволно при движение

Начертах контур на малък 2D правоъгълник в OpenGL с GL_LINE_LOOP - много стандартни неща, предоставени от множество уроци. Правоъгълникът не се върти в пространството, като оста му е подравнена спрямо екрана. Имам извикване на glTranslatef(x, y), за да накарам моя правоъгълник да се движи по екрана. Координатите на Vertex са постоянна част от ширината и височината на екрана.

Когато правоъгълникът се движи много бавно, забелязвам, че долната или горната граница може да се премести малко по-рано от границата на правоъгълника, която следва непосредствено след това. Това е само пиксел и за част от секундата, но прави анимацията да изглежда грозна.

Няма значение дали антиалиасът е включен или изключен, въпреки че ако антиалиасът е включен, линията временно изглежда удвоена (или удебелена).

Чудех се дали това е стандарт в OpenGL и дали има команда, която ми липсва, за да избегна минипреоразмеряване при анимиране на правоъгълника.


person CodeTrek    schedule 25.09.2015    source източник


Отговори (1)


Въз основа на описанието най-вероятно това е вашият проблем:

Координатите на Vertex са постоянна част от ширината и височината на екрана.

Тези координати на теория са точно на границата между два пиксела. Поради неточността на плаващата запетая, резултатът е, че върхът може да се окаже вътре в един от два съседни пиксела.

За да направите обяснението просто, кажете, че прозорецът ви има ширина 20 пиксела и използвате NDC (нормализирани координати на устройството), за да посочите вашите върхове. Така че диапазонът на координатите е [-1.0, 1.0]. Разделянето на диапазона от 2,0 координатни единици на 20 пиксела означава, че всеки пиксел е широк 0,1 единици. Тогава диапазоните на координатите, обхванати от всеки пиксел, са:

[-1.0, -0.9], [-0.9, -0.8], [-0.8, -0.7], ... , [0.8, 0.9], [0.9, 1.0]

Така че, ако използвате координати, които са части от броя на пикселите, като -0,8, тази координата е на границата между два пиксела.

Ако искате да рисувате с точност до пиксели, ще имате много по-голям успех, като използвате координати, които са в центъра на пиксел. В горния пример бихте използвали следните координати за адресиране на всеки пиксел:

-0.95, -0.85, -0.75, ... , 0.85, 0.95

Като цяло, ако вашият диапазон от координати е от xMin до xMax и имате n пиксела в този диапазон, централната координата на пиксел k е:

xMin + ((k + 0.5) / n) * (xMax - xMin)
person Reto Koradi    schedule 25.09.2015
comment
Благодаря ти. Мислех да го реша по подобен начин, но се надявах, че OpenGL ще има нещо вградено, за да предотврати това да се случи. - person CodeTrek; 25.09.2015