如何使用带有 GL_LINEAR 过滤的浮动位置在屏幕上滚动纹理四边形“精确像素”?如果我尝试这个任务,如果子像素坐标大于或等于 0.5,我总是可以在非常平滑的移动过程中看到硬像素变化。这看起来非常难看。
我认为问题出在这里,在滚动 0.5 个子像素后,四边形与纹理坐标如此不对齐,以至于 OpenGL 现在需要另一个相邻像素来进行新插值的纹理处理,因此新绘制的子像素与之前渲染的子像素不对齐?!
可能是这里的解决方案,重新对齐位置 > 0.5f 上的纹理坐标?有人可以帮我解决这个问题并计算正确的紫外线坐标吗?如果四边形子像素位置> = 0.5f,我认为紫外线坐标应该移动到一个新位置。
这是屏幕截图的链接,它显示了最后一帧 x=0.5f 上 x 方向(左)的硬像素跳跃。(用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
- 为纹理添加了透明边框而不是复制的边框