纹理无法正常显示 - 可能坐标是错误的OpenGL,C ++

时间:2012-12-18 08:40:59

标签: c++ opengl graphics textures

我会尝试用图像解释我的问题。所以这是我用于OpenGL应用程序的测试纹理:

正如您所看到的,图像周围有一个2像素宽的边框,不同的颜色让我能够看到我的应用程序中是否正确设置了坐标。

我正在使用9格单元格,所以我正在绘制具有特定纹理坐标的9个四边形。乍一看一切正常,但显示纹理有一个小问题:

enter image description here

在图片中,我标记的是第一个四边形,第二个在哪里。正如你所看到的,第一个正确显示,但第二个平滑地从第一个四边形颜色到它自己的颜色,但它应该从纯绿色和粉红色开始。所以我猜这是纹理坐标的问题。

这是他们的设定方式:

// 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

有人可以帮忙找出问题所在吗?

3 个答案:

答案 0 :(得分:4)

最可能的罪魁祸首是你没有在texel中心采样。例如,如果您具有32x32像素纹理,则纹理像素中心将偏移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。

答案 1 :(得分:4)

你遇到了fencepost问题。我在这里回答了你的问题的解决方案

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

答案 2 :(得分:-2)

你使用int和float ...

这可能是原因,也就是你在opengl窗口上显示图像的方式也可以给出一些颜色效果。