不久前,我在显示纹理时遇到了问题,因为我使用纹素的边缘作为纹理坐标而不是纹素的中心。这与线性混合相结合,给出了颜色的平滑结果,而不是纹理给出的纯色。
感谢这里给我的建议,当我开始使用纹素的中心作为坐标时,我认为我的问题已经解决了,但它只在一种情况下有效,我不知道为什么只在那种情况下有效。
我再展示一些图片。
这是我正在使用的纹理(32x32 像素),边框为 2 像素:
我正在绘制的整个对象由 9 个四边形组成,但它们只使用一个纹理(我展示的那个)。其中之一将作为我的问题的解释:
我认为很明显,该四边形的颜色没有根据纹理正确设置。
它看起来像是混合的问题,但是为了设置纹理坐标,我使用了纹素的中心,如下所示:
glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset);
glVertex2i(pos.x, pos.y + height - m_borderWidth);
// Top left
glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset);
glVertex2i(pos.x, pos.y + m_borderWidth);
// Top right
glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset);
glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth);
// Bottom right
glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
glEnd();
为了澄清:
m_borderWidth
= 2
maxTexCoordBorderX
= maxTexCoordBorderY
= 2/32 = 0.0625
texelCentersOffset
= 1/64 = 0.015625
谁能告诉我我写的东西有什么问题?
编辑1:
这是我的纹理的设置:
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT );
gluBuild2DMipmaps( GL_TEXTURE_2D, 4, m_width, m_height,
GL_RGBA, GL_UNSIGNED_BYTE, pixmap );
当我从 GL_LINEAR 更改为 GL_NEAREST 时,它可以正常工作,所以这显然是混合的问题,但仍然无法弄清楚为什么它是错误的。
编辑2:
当我将四边形的高度增加到与纹理的高度相同或更大时,它可以正常工作而不会更改任何纹理坐标。