Pio*_*cki 9 c++ opengl graphics textures
不久前我在显示纹理方面遇到了问题,因为我使用纹素的边缘作为纹理坐标而不是纹素的中心.这与线性混合相结合,给出了平滑的颜色效果,而不是纹理给出的纯色.
感谢我在这里给出的建议,我认为我的问题解决了,因为我开始使用纹素中心作为坐标,但它只在一个案例中工作,我不知道为什么只在那一个案例中.
我再次展示一些照片.
这是我正在使用的纹理(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();
Run Code Online (Sandbox Code Playgroud)
为了澄清:
m_borderWidth = 2
maxTexCoordBorderX= maxTexCoordBorderY= 2/32 = 0.0625
texelCentersOffset = 1/64 = 0.015625
谁能告诉我我写的内容有什么问题?
EDIT1:
以下是我的纹理设置:
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 );
Run Code Online (Sandbox Code Playgroud)
当我从GL_LINEAR更改为GL_NEAREST时,它正常工作,这显然是混合的问题,但仍然无法弄清楚为什么它是错误的.
EDIT2:
当我将quad的高度增加到与纹理高度相同或更大时,它可以正常工作而不会更改任何纹理坐标.
在我看来,当您将四边形尺寸设置为小于纹理尺寸时。它必须使用 mipmap 对纹理进行采样。
Mipmap 是通过对 4 个纹素块进行平均而生成的。因此,当您对 mipmap 进行采样时,您会从多个纹素中获取信息。因此,通过让四边形小于纹理,它必须对 mipmap 进行采样,并且您会得到纹理渗色。关闭 mipmap,我猜它会消失。
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |