纹理未正确显示 - 可能是坐标错误OpenGL,C ++

8
我将尝试通过图片来解释我的问题。这是我在OpenGL应用程序中使用的一个测试纹理:
如您所见,它有一个2像素宽的边框,边框的颜色不同,以便我能够看到是否在我的应用程序中正确设置了坐标。
我使用一个9格模式,因此我绘制了9个具有特定纹理坐标的矩形。乍一看,一切都正常,但显示纹理时存在一个小问题:
在这张图片中,我标记了第一个矩形和第二个矩形的位置。 正如您所见,第一个矩形被正确显示,但第二个矩形平滑地从第一个矩形的颜色过渡到它自己的颜色,但它应该从纯绿色和粉色开始。 因此,我猜测这是一个纹理坐标的问题。
以下是它们的设置方式:
// Bottom left quad [1st quad]
glBegin(GL_QUADS);
    // Bottom left
    glTexCoord2f(0.0f, 1.0);                
    glVertex2i(pos.x, pos.y + height);

    // Top left
    glTexCoord2f(0.0f, (GLfloat)1.0 - maxTexCoordBorderY);  
    glVertex2i(pos.x, pos.y + height - m_borderWidth);

    // Top right
    glTexCoord2f(maxTexCoordBorderX, (GLfloat)1.0 - maxTexCoordBorderY);
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);

    // Bottom right
    glTexCoord2f(maxTexCoordBorderX, 1.0);
    glVertex2i(pos.x + m_borderWidth, pos.y + height);
glEnd();

// Bottom middle quad [2nd quad]
glBegin(GL_QUADS);
    // Bottom left
    glTexCoord2f(maxTexCoordBorderX, 1.0);          
    glVertex2i(pos.x + m_borderWidth, pos.y + height);

    // Top left
    glTexCoord2f(maxTexCoordBorderX, (GLfloat)1.0 - maxTexCoordBorderY);
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);

    // Top right
    glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, (GLfloat)1.0 - maxTexCoordBorderY);
    glVertex2i(pos.x + width - m_borderWidth, pos.y + height - m_borderWidth);

    // Bottom right
    glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, 1.0);   
    glVertex2i(pos.x + width - m_borderWidth, pos.y + height);
glEnd();

您可以看到我正在使用maxTexCoordBorderX变量,该变量基于边框和图像大小进行计算。 图像宽度为32,边框宽度为2。

maxTexCoordBorderX = 2 / 32 = 0.0625

请问有人能帮忙找出问题所在吗?

2个回答

4
最有可能的原因是您没有在纹素中心取样。例如,如果您有一个32x32像素的纹理,则纹素中心会偏移1/64。
这是一个4x4纹理的粗略图示。方块是图像的纹素(或像素)。
如果您在其中一条线上采样,您将得到两个纹素之间的完全值,这将(如果您将纹理采样设置为线性混合)给您一个平均值。如果您想要采样准确的纹素值,您需要指定在纹素中心的u、v。

谢谢你的回答,Jason。但是,你能解释一下在纹素中心采样是什么意思吗? - Piotr Chojnacki

4

谢谢 datenwolf 的回答,非常有帮助! - Piotr Chojnacki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接