Рисование текстурированного четырехпиксельного точного пикселя в 2D с помощью OpenGL 3.3?

Как прокрутить текстурированный квадроцикл с точностью до пикселя по экрану
используя float-позиции с GL_LINEAR-фильтрацией?
Если я попробую эту задачу, я всегда смогу увидеть жесткую смену пикселей
во время очень плавного движения, если субпиксельная координата
больше или равно 0,5. Это похоже на действительно уродливое заикание.

Я думаю, что проблема здесь, что после прокрутки 0,5 субпикселей
четырехугольник настолько смещен по координатам текстуры, что OpenGL
теперь принимает другой соседний пиксель для текстурирования, который недавно
интерполирован и поэтому новый нарисованный подпиксель не выровнен по
переданный субпиксель раньше ?!

Может быть решение здесь, чтобы перестроить текстуру-координаты
на позиции> 0.5f? Может ли кто-нибудь помочь мне с функцией,
что решает эту проблему и вычисляет правильные уф-координаты?
Я думаю, что UV-координаты должны быть перемещены в новую позицию
если субпиксельная позиция четырехугольников> = 0.5f.

Вот ссылка на скриншот, который показывает точный прыжок пикселей
в направлении x (слева) на x = 0.5f в последнем кадре.
(увеличить скриншот с помощью strg + колесико мыши)

http://i.stack.imgur.com/n0GVA.png

Вот соответствующие фрагменты кода:

float calcTexPos(float fTexPos,float spriteX, float spriteY){return (fTexPos)/(64.0f);}

void addSpriteToLocalVerticeArray(Vertex * ptrVertexArrayLocal, Sprite *sprite, int *ptrSpriteVerticeCounter, float fCamX, float fCamY)
{
Sprite oSpriteTranslated = *sprite;
oSpriteTranslated.x = (sprite->x) - (fCamX);
oSpriteTranslated.y = (sprite->y) - (fCamY);

ptrVertexArrayLocal[(*ptrSpriteVerticeCounter)++] = Vertex(oSpriteTranslated.x,oSpriteTranslated.y,0.0f,calcTexPos(1,oSpriteTranslated.x,oSpriteTranslated.y),calcTexPos(62,oSpriteTranslated.x,oSpriteTranslated.y));                                                     //Left Top
ptrVertexArrayLocal[(*ptrSpriteVerticeCounter)++] = Vertex(oSpriteTranslated.x,oSpriteTranslated.y-oSpriteTranslated.height,0.0f,calcTexPos(1,oSpriteTranslated.x,oSpriteTranslated.y),calcTexPos(31,oSpriteTranslated.x,oSpriteTranslated.y));                            //Left Bottom
ptrVertexArrayLocal[(*ptrSpriteVerticeCounter)++] = Vertex(oSpriteTranslated.x+oSpriteTranslated.width,oSpriteTranslated.y-oSpriteTranslated.height,0.0f,calcTexPos(33,oSpriteTranslated.x,oSpriteTranslated.y),calcTexPos(31,oSpriteTranslated.x,oSpriteTranslated.y));   //Right Bottom
ptrVertexArrayLocal[(*ptrSpriteVerticeCounter)++] = Vertex(oSpriteTranslated.x+oSpriteTranslated.width,oSpriteTranslated.y-oSpriteTranslated.height,0.0f,calcTexPos(33,oSpriteTranslated.x,oSpriteTranslated.y),calcTexPos(31,oSpriteTranslated.x,oSpriteTranslated.y));   //Right Bottom
ptrVertexArrayLocal[(*ptrSpriteVerticeCounter)++] = Vertex(oSpriteTranslated.x+oSpriteTranslated.width,oSpriteTranslated.y,0.0f,calcTexPos(33,oSpriteTranslated.x,oSpriteTranslated.y),calcTexPos(62,oSpriteTranslated.x,oSpriteTranslated.y));                            //Right Top
ptrVertexArrayLocal[(*ptrSpriteVerticeCounter)++] = Vertex(oSpriteTranslated.x,oSpriteTranslated.y,0.0f,calcTexPos(1,oSpriteTranslated.x,oSpriteTranslated.y),calcTexPos(62,oSpriteTranslated.x,oSpriteTranslated.y));                                                     //Left Top
}

То, что я попробовал, не сработало:

  • Добавление смещения 0.5f к моим квадро-координатам. Это перемещает проблему на сцену, что
    теперь в каждой полной субпиксельной позиции 1.0f появляется жесткое изменение субпикселя.
  • Изменение функции calcTexPos: -> (2.0f * fTexPos + 1.0f) / (2.0f * 64.0f)
  • Проверка, активирован ли MSAA на панели драйверов
  • Добавлены прозрачные границы в текстуру вместо скопированных границ

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]