Как прокрутить текстурированный квадроцикл с точностью до пикселя по экрану
используя 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
}
То, что я попробовал, не сработало:
Задача ещё не решена.
Других решений пока нет …