使用OpenGL 3.3在2D中绘制带纹理的四像素精确像素?

时间:2013-09-24 19:25:26

标签: c++ opengl smooth-scrolling texturing pixel-perfect

如何在屏幕上滚动纹理四边形“像素精确” 使用GLLINEAR过滤的浮点位置? 如果我尝试这个任务,我总能看到一个难以改变的像素 如果子像素坐标是非常平滑的运动 大于或等于0.5。这看起来像一个非常丑陋的口吃。

我认为问题出在这里,滚动0.5个子像素后 四边形与纹理坐标错位,即OpenGL 现在采用新的纹理化的另一个相邻像素 插值,因此新绘制的子像素未对齐 ?之前的渲染子像素?

这里可以解决方案,重新调整纹理坐标 在位置> 0.5F?有人可以帮我一个功能, 处理这个问题并计算正确的紫外坐标? 我认为uv坐标应该移动到一个新的位置 如果四边形子像素位置是> = 0.5f。

以下是屏幕截图的链接,其中显示了硬像素跳转 在最后一帧中x = 0.5f的x方向(左)。 (使用strg + mousewheel缩放屏幕截图)

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
  • 为纹理添加了透明边框而不是复制的边框

0 个答案:

没有答案