1

如何使用带有 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
  • 为纹理添加了透明边框而不是复制的边框
4

0 回答 0