不久前,我在使用纹理边缘而不是纹理中心时显示纹理时出现问题。这与线性混合组合给出了颜色的平滑结果,而不是由纹理给出的纯色。纹理中心的采样不会给出正确的结果,OpenGL,C++
感谢这里给出的建议,我认为我的问题已经解决了,因为我开始使用texels中心作为坐标,但它只适用于一种情况,我不知道为什么只在这种情况下。
再次我会显示一些图片。
这是我使用贴图(32×32像素)的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
有人能告诉我我写的内容有什么问题吗?
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);
当我从GL_LINEAR改变GL_NEAREST,它工作正常所以这显然与混合的问题,但仍然想不通为什么它是错的。
EDIT2:
当我增加四的高度比纹理的高度相同或更大,它工作正常不改变任何纹理坐标。
你在哪里设置你的投影和模型视图矩阵? 'pos'的价值是什么? – genpfault
@genpfault pos.x和pos。y是0,所以它们可以省略。 矩阵设置在像这样的开始处: glViewport(0,0,width,height); //重置当前视口 glMatrixMode(GL_PROJECTION); //选择投影矩阵 glLoadIdentity(); \t \t \t \t \t \t \t \t \t //重置投影矩阵 \t glOrtho(0.0,宽度,高度,0.0,0.0,1.0); glMatrixMode(GL_MODELVIEW); \t \t \t \t \t \t //选择模型视图矩阵 glLoadIdentity(); \t \t \t \t \t \t \t \t \t //重置模型变换矩阵 –
你不应该尝试分配纹理像素中心的顶点。你真正想要的是texels是否在光栅化之后以结果片段*为中心。我在这里写了一个漂亮的答案(有图片解释),也许阅读这将有助于你理解:http://stackoverflow.com/a/11458037/1236185 – Tim