【问题标题】:OpenGL - 2D Texture MappingOpenGL - 2D 纹理映射
【发布时间】:2011-08-25 12:12:38
【问题描述】:

我正在尝试将简单的纹理 (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,但我仍然只是得到一个白框,我会尝试更多设置,但我认为不是这样。 (编辑:尝试了各种标志,什么都没有,仍然只是一个白色的四边形。)

【问题讨论】:

  • hm.. 我已经与相应的 nehe 教程 (nehe.gamedev.net/data/lessons/lesson.asp?lesson=06) 进行了交叉检查,但在 OpenGL 调用中我找不到任何尴尬的地方。你确定,图片加载功能正常吗?
  • 要验证 Constantinius,自动生成棋盘往往是最简单的事情。例如。 for(every x){ for(every y) { color = ((x^y)&8) ?黑,白; } }
  • 嗯,我的错误处理看起来是正确的,它也不会呈现棋盘格,但是,我也可能做错了,我基本上是复制粘贴它以快速完成。 //csc.villanova.edu/~mdamian/graphics/notes/GLTextures/…
  • 我的四边形会不会倒退,我正在破解一个游戏,所以我不知道它使用的是哪种世界系统,也许将四边形翻转过来?
  • 如果你说你可以看到你的四边形,但只是没有纹理,我猜这不会改变任何事情。顺便说一句,你的意思是背面剔除,你可以通过输入 glDisable(GL_CULL_FACE); 来关闭它。

标签: c++ c opengl texture-mapping


【解决方案1】:

你试过打电话吗

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);

【讨论】:

  • 我遇到了这个问题,您帮我解决了,谢谢。我在 glBegin() 附近调用 BindTexture,我需要在 glBindTexture 之后移动 glTextParameterf() 调用。状态机:)。
  • +1 我正在关注一个教程,但他们没有提到对glEnable(GL_TEXTURE_2D); 的调用。感谢您的回答,我的问题解决了。
【解决方案2】:

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

static GLuint Texture;

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

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

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

【讨论】:

  • 是的,它们都在同一个文件中,现在所有函数中的数字都是正确的。那是由于游戏引擎在启动期间我正在破解转储纹理(无论出于何种原因)。 (我现在在游戏完全加载后使用按键来触发我的代码。)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    尝试不同的纹理函数以满足您的需要:GL_DECAL、GL_BLEND、GL_MODULATE 等。

    【讨论】:

    • 嗯,这可能有所帮助,但这不是问题所在。我尝试了各种标志,它们都给出了相同的结果,一个空白的白色四边形。
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2011-03-16
    • 1970-01-01
    • 2012-07-28
    • 2011-05-16
    • 1970-01-01
    • 2014-12-30
    • 2012-08-30
    相关资源
    最近更新 更多