Pio*_*cki 8 c++ opengl graphics textures
我会尝试用图像解释我的问题.所以这是我用于OpenGL应用程序的测试纹理:
正如您所看到的,图像周围有一个2像素宽的边框,不同的颜色让我能够看到我的应用程序中是否正确设置了坐标.
我正在使用9格单元格,所以我用特定的纹理坐标绘制了9个四边形.乍一看一切正常,但显示纹理有一个小问题:
在图片中,我标记的是第一个四边形,第二个在哪里.正如你所看到的,第一个正确显示,但第二个平滑地从第一个四边形颜色到它自己的颜色,但它应该从纯绿色和粉红色开始.所以我猜它是纹理坐标的问题.
这是他们的设置方式:
// Bottom left quad [1st quad]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(0.0f, 1.0);
glVertex2i(pos.x, pos.y + height);
// Top left
glTexCoord2f(0.0f, (GLfloat)1.0 - maxTexCoordBorderY);
glVertex2i(pos.x, pos.y + height - m_borderWidth);
// Top right
glTexCoord2f(maxTexCoordBorderX, (GLfloat)1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
// Bottom right
glTexCoord2f(maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + m_borderWidth, pos.y + height);
glEnd();
// Bottom middle quad [2nd quad]
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + m_borderWidth, pos.y + height);
// Top left
glTexCoord2f(maxTexCoordBorderX, (GLfloat)1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
// Top right
glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, (GLfloat)1.0 - maxTexCoordBorderY);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height - m_borderWidth);
// Bottom right
glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, 1.0);
glVertex2i(pos.x + width - m_borderWidth, pos.y + height);
glEnd();
Run Code Online (Sandbox Code Playgroud)
您可以看到我正在使用maxTexCoordBorderX
基于边框和图像大小计算的变量.图像宽度为32,边框宽度为2.
maxTexCoordBorderX
= 2/32 = 0.0625
有谁可以帮助找出问题所在?
最有可能的罪魁祸首是你没有在纹理像素中心采样。例如,如果您有 32x32 像素纹理,则纹素中心偏移 1/64。
这是 4x4 纹理的粗略图。正方形是图像的纹素(或像素)。
_________________1,1 | | | | | | | | | | |___|___|___|___|_0.75 | | | | | | | | | | |___|___|___|___|_0.5 | | | | | | | | | | |___|___|___|___|_0.25 | | | | | | X | | | | |___|___|___|___| 0,0 | 0.5 | 0.5 1 0.25 0.75 x = (0.125, 0.125)
如果您对其中一条线进行采样,您将获得恰好位于两个纹理像素之间的值,这将(如果您将纹理采样设置为线性混合)为您提供平均值。如果要采样精确的纹素值,则需要在纹素的中心指定 au,v。