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

Posted

技术标签:

【中文标题】纹理未正确显示 - 可能坐标是错误的 OpenGL、C++【英文标题】:Texture not displaying properly - probably coordinates are wrong OpenGL, C++ 【发布时间】:2012-12-18 08:40:58 【问题描述】:

我将尝试解释我的图像问题。所以这是我用于 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

谁能帮忙找出问题出在哪里?

【问题讨论】:

【参考方案1】:

最可能的罪魁祸首是您没有在纹素中心进行采样。例如,如果您有一个 32x32 像素的纹理,则 texel-centers 偏移 1/64。

这是 4x4 纹理的粗略图。方块是图像的纹素(或像素)。

_________________1,1 | | | | | | | | | | |___|___|___|___|_0.75 | | | | | | | | | | |___|___|___|___|_0.5 | | | | | | | | | | |___|___|___|___|_0.25 | | | | | | X | | | | |___|___|___|___| 0,0 | 0.5 | 1 0.25 0.75 x = (0.125, 0.125)

如果您在其中一条线上进行采样,您将获得一个恰好在两个纹素之间的值,这将(如果您将纹理采样设置为线性混合)为您提供一个平均值。如果要对精确的纹素值进行采样,则需要在纹素的中心指定一个 u,v。

【讨论】:

感谢 Jason 的回答,但您能解释一下您在纹素中心采样是什么意思吗?【参考方案2】:

您遇到了围栏问题。我在这里回答了您的问题的解决方案

https://***.com/a/5879551/524368

【讨论】:

感谢 datenwolf 的回答,很有帮助!

以上是关于纹理未正确显示 - 可能坐标是错误的 OpenGL、C++的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 纹理未正确映射

C++ OpenGL 错误的 Collada 纹理坐标

obj 模型加载纹理坐标和顶点位置未正确加载

使用 VBO/IBO 的 OpenGL 纹理三角形

我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题

我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题