不久前,我在显示纹理时遇到问题,因为我使用纹理像素的边缘作为纹理坐标而不是纹理像素的中心。与线性混合相结合,可以提供平滑的颜色效果,而不是纹理给出的纯色效果。
多亏了这里给我的建议,我认为我的问题已经解决,因为我开始使用纹素中心作为坐标,但是它仅在一种情况下有效,我不知道为什么仅在这种情况下有效。
再次,我将显示一些图片。
这是我使用的纹理(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
= 2maxTexCoordBorderX
= maxTexCoordBorderY
= 2/32 = 0.0625texelCentersOffset
= 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:
当我将Quad的高度增加到等于或大于纹理的高度时,它可以正常工作而无需更改任何纹理坐标。
最佳答案
在我看来,当您将四边形尺寸设置为小于纹理尺寸时。它必须使用mipmap对纹理进行采样。
通过平均4个纹理像素块来制作Mipmap。因此,当您对Mipmap进行采样时,您会从多个纹理像素中获取信息。因此,通过使四边形小于纹理,必须对一个mipmap进行采样,从而使纹理流血。关闭mipmapping,我猜它将会消失。
关于c++ - 在texel中心进行采样无法提供正确的结果,OpenGL,C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13935961/