2012-12-18 33 views
9

不久前,我在使用纹理边缘而不是纹理中心时显示纹理时出现问题。这与线性混合组合给出了颜色的平滑结果,而不是由纹理给出的纯色。纹理中心的采样不会给出正确的结果,OpenGL,C++

感谢这里给出的建议,我认为我的问题已经解决了,因为我开始使用texels中心作为坐标,但它只适用于一种情况,我不知道为什么只在这种情况下。

再次我会显示一些图片。

这是我使用贴图(32×32像素)的2个像素边界:

enter image description here

我正在被抽取的全对象由9辆四轮摩托车,但他们只使用一个纹理(我展示的那个)。其中一人将作为解释我的问题:

enter image description here

我觉得这是非常明显的是那四的颜色不按质地正确设置。

它看起来像混合了问题,但是设置纹理坐标我用纹理元素中心,是这样的:

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:

当我增加四的高度比纹理的高度相同或更大,它工作正常不改变任何纹理坐标。

+0

你在哪里设置你的投影和模型视图矩阵? 'pos'的价值是什么? – genpfault

+0

@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 //重置模型变换矩阵 –

+0

你不应该尝试分配纹理像素中心的顶点。你真正想要的是texels是否在光栅化之后以结果片段*为中心。我在这里写了一个漂亮的答案(有图片解释),也许阅读这将有助于你理解:http://stackoverflow.com/a/11458037/1236185 – Tim

回答

1

在我看来,当你设置的四倍大小小于纹理的大小。它必须使用mipmap对纹理进行采样。

Mipmaps是通过平均4 texel块。所以,当你对mipmap进行采样时,你可以从多个纹理中获取信息。所以,通过让你的四边形比纹理更小,它必须对一个mipmap进行采样,并且你得到纹理流血。关闭mipmapping,我的猜测是它会消失。

+0

对不起,很抱歉,这是个问题。谢谢,托克斯! –