OpenGL ES纹理略微偏离

时间:2011-05-16 21:02:27

标签: c++ opengl-es textures

我正在尝试通过指定我想要的坐标在OpenGL中绘制纹理的子区域。然而,正在发生的是,根据图像的大小,它似乎在选择纹理坐标的位置处有轻微的偏移。偏移量似乎小于像素的大小&输出是相邻像素的模糊组合。

以下是我所描述的内容。在这种情况下,我想要选择6x5绿色/白色区域,但是OpenGL渲染的内容包括顶部和外部的轻微粉红色调。左像素。 Offset Illustration

输出结果如下:

Resulting Output Texture

我可以通过在将它们传递给glTexCoordPointer之前向纹理坐标添加偏移来修复它,但问题是我无法计算偏移量是什么,并且对于不同的纹理看起来不同。

伪代码:

float uFactor = regionWidth / textureWidth;   // For the example: 0.6f
float vFactor = regionHeight / textureHeight; // For the example: 0.5f

data[0].t[0] = 0.0f * uFactor;
data[0].t[1] = 0.0f * vFactor;
data[1].t[0] = 1.0f * uFactor;
data[1].t[1] = 0.0f * vFactor;
data[2].t[0] = 0.0f * uFactor;
data[2].t[1] = 1.0f * vFactor;
data[3].t[0] = 1.0f * uFactor;
data[3].t[1] = 1.0f * vFactor;

glPushMatrix();

// translate/scale/bind operations

glTexCoordPointer(2, GL_FLOAT, 0, data[0].t);

2 个答案:

答案 0 :(得分:18)

请记住,OpenGL会在纹素中心对纹理进行采样。因此,当使用线性过滤(如GL_LINEARGL_LINEAR_MIPMAP_LINEAR)时,只有在纹素中心采样时才会返回确切的纹理颜色。因此,当您只想使用纹理的子区域时,需要将纹理坐标缩进半个纹素(或0.5/width0.5/height)。否则,过滤将混合纹理的边框与您想要的区域之外的邻接纹理。这会使你的边缘略带粉红色。如果你用完整个纹理,这个效果会被GL_CLAMP_TO_EDGE包裹模式补偿,但是当使用子区域时,GL不知道它的边缘在哪里,并且过滤不应该越过它。

因此,当您在[s1,s2]x[t1,t2]0 <= s,t <= 1)范围内获得纹理的子区域时,真正有效的texCoord间隔应为[s1+x,s2-x]x[t1+y,t2-y]x为{{1} }和0.5/width y(整个纹​​理的宽度和高度对应being 0.5/height)。

因此请尝试

[0,1]x[0,1]

答案 1 :(得分:4)

这可能与环绕有关。在创建源图像时尝试此操作:

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP )
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP )