【问题标题】:What's wrong with this Texture Mapping?这个纹理映射有什么问题?
【发布时间】:2012-12-28 07:18:08
【问题描述】:

因为 openGL 的纹理映射,我快要发疯了。它永远不会映射正确的东西,请看一下。

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, speed.texID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glBegin(GL_QUADS);
    glTexCoord2f(1,0); 
    glVertex2f(210, 638);   //Top-Left
    glTexCoord2f(1,1);
    glVertex2f(210, 438);   //Top-Right
    glTexCoord2f(0,1); 
    glVertex2f(10, 438);    //Bottom-Right
    glTexCoord2f(0,0);
    glVertex2f(10, 638);    //Bottom-Left
glEnd();
glDisable(GL_TEXTURE_2D);

这段代码输出后的图片变成了这样:

但我希望它是这样的:

当我将纹理更改为其他内容时,它会正确映射它,但显然不是这个。你认为为什么会这样?

【问题讨论】:

  • 好吧,如果此代码适用于其他纹理(即 glBindTexture 的其他参数),也许值得研究一下如何创建此特定纹理。
  • 首先,(210, 638) 在笛卡尔坐标中是 Top-Right
  • 如果其他纹理有效,则该纹理的大小或格式可能是奇怪的,并且在加载时没有观察到一些必要的填充。
  • @JasonD 更重要的是,纹理是 199x200。我高度怀疑读取纹理的代码中存在错误。
  • 感谢 JasonD,这确实是奇怪的大小问题。我不敢相信我花了几个小时来解决这个问题。

标签: opengl textures hud


【解决方案1】:

如果其他纹理有效,则该纹理可能是奇怪的大小或不同的格式,并且在加载时没有观察到一些必要的填充。

纹理格式通常需要偶数个像素,或者四舍五入到其他倍数。

纹理的 45 度倾斜也表明存在此类问题,因为它通常是由于管道中某个点的每一行都读取(或跳过)了额外的像素。

可能的解决方法是:

  • 更改纹理的尺寸,以便没有填充。
  • 更改纹理的加载,使填充与 GL 的预期一致
  • 告诉 GL 你的纹理是如何打包的,使用glPixelStorei()

【讨论】:

  • 问题是设置像素对齐的简单遗漏,请参阅 Felix K. 的回答。没有必要使尺寸均匀。抱歉,但在这种形式下,您的答案看似不正确。请修复它。
【解决方案2】:

如果您使用的纹理无法对齐到 4 个字节,您必须关心一些事情,其中​​之一是设置正确的像素包和解包对齐:

glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

欲了解更多信息,请参阅here.

【讨论】:

  • 像素对齐注意事项与 NPOT 格式无关。例如,如果您有 RGB 像素(即没有 alpha 通道),无论是否有 NPOT,您都无法进行 4 字节对齐。 GL_One 也相当少见。只写'1'。 GL_PACK_ALIGNMENT 用于从 OpenGL (glReadPixels) 取回图像数据,您不需要设置它来上传纹理。
  • @datenwolf 改变了我的答案。谢谢。从来没有说过他应该使用GL_One,这只是一个示例代码。
  • 嗯,GL_One 甚至不是标准令牌,无论您从哪里得到它,它都不是原始的 OpenGL 规范。 GL_ONE(大写字母)存在,但这是用于glBlendFunc。既没有GL_Two,也没有GL_Four。请将此更改为数字文字。
  • @datenwolf 抱歉,我忘记了我正在使用定义它们的 .NET 包装器public enum PixelStoreValue : int { One, Two, Four }。只是将其更改为GL_One,因为我认为在 OpenGL 中也使用了 GL_One。
  • 在 .net 中有这个枚举是有意义的,因为这会强制这个特定参数的强静态类型化。如果您查看其他强静态类型语言(如 Haskell、OCaml、Go 等)中的 OpenGL 包装器,您会发现类似的枚举。
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 2014-08-22
  • 2011-08-30
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多