OpenGL - 2D纹理映射

时间:2011-05-14 12:53:20

标签: c++ c opengl texture-mapping

我正在尝试将简单的纹理(64x64)渲染为64x64四边形。四边形本身是渲染,但不是纹理。 (它呈现一个空白的64x64四边形。)

我正在使用SOIL加载图片。

static GLuint LoadPNG(char* filename)
{
    GLuint texture = SOIL_load_OGL_texture
    (
        filename,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

    if (texture == 0)
        Log("Texture Load Error: " + string(filename));

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return texture;
}

这是我的渲染代码,我可能没有正确映射,所以这也可能是问题。

// Draw Textured Quad
static void glDrawTexturedQuad(glRectF rect, GLuint tex)
{
    // Bind Texture
    glBindTexture (GL_TEXTURE_2D, tex);

    // Render Settings
    glEnable(GL_TEXTURE_2D);
    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glColor3ub(255,255,255);

    glBegin(GL_QUADS);

    // Top Left
    glTexCoord2f(0, 1);
    glVertex2f(rect.X, rect.Y);

    // Top Right
    glTexCoord2f(1, 1);
    glVertex2f(rect.X + rect.Width, rect.Y); 

    // Bottom Right
    glTexCoord2f(1, 0);
    glVertex2f(rect.X + rect.Width, rect.Y + rect.Height); 

    // Bottom Left
    glTexCoord2f(0, 0);
    glVertex2f(rect.X, rect.Y + rect.Height);

    glEnd();
}

以下是相关代码的其余部分。 (这实际上只是临时代码,将它们粘合在一起进行测试,在我开始工作之后我会想出一个更好的解决方案。)

static GLuint Texture;

static void LoadTextures()
{
    Texture = LoadPNG("filename");
}

static void glRenderTest()
{   
    glRectF rect = {20, 20, 64, 64};
    glDrawTexturedQuad(rect, Texture);
}

我也遵循了here找到的所有建议。它仍然没有显示我的纹理。


我将LodePNG替换为SOIL(简单的OpenGL图像库),它使用起来有点容易,但仍然无效。

我按照下面的答案中的建议添加了glTexEnv,但我仍然只是得到一个白色的盒子,我会尝试更多的设置,但我不认为那是它。 (编辑:尝试了各种标志,没有,只是一个白色四边形。)

4 个答案:

答案 0 :(得分:7)

你尝试过调用

吗?
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, texture);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

答案 1 :(得分:1)

所有这些都在同一个文件中吗?

static GLuint Texture;

static void LoadTextures()
{
    Texture = LoadPNG("filename");
}

static void glRenderTest()
{   
    glRectF rect = {20, 20, 64, 64};
    glDrawTexturedQuad(rect, Texture);
}

如果它们不在同一个文件中,那么好的static变量将在每个编译单元中具有独立的副本,在程序启动时单独初始化为零。这可以解释为什么在加载器返回1之后绑定纹理#0。

答案 2 :(得分:1)

尝试使用gDEBugger gDEBugger。它将让您看到已加载到OpenGL中的所有纹理,并提供其他调试工具。

答案 3 :(得分:0)

我没有看到你设置纹理功能。尝试在几何绘图函数中添加glBindTexture之后:

glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ); // texture function: GL_DECAL, GL_MODULATE, etc.

尝试不同的纹理功能以满足您的需求:GL_DECAL,GL_BLEND,GL_MODULATE等。