Opengl 什么';这个纹理贴图有什么问题?

Opengl 什么';这个纹理贴图有什么问题?,opengl,textures,hud,Opengl,Textures,Hud,我快要发疯了,因为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

我快要发疯了,因为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);
此代码输出图像变为以下内容后:

但我希望它是这样的:


当我将纹理更改为其他纹理时,它会正确地映射它,但显然不是此纹理。您认为这是为什么?

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

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

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

可能的修复方法有:

  • 更改纹理的尺寸,这样就不会有填充
  • 更改纹理的加载,使填充与GL期望的一致
  • 使用
    glPixelStorei()

如果使用的纹理无法对齐到4字节,则需要注意几件事,其中之一是设置正确的像素包和解包对齐方式:

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

有关更多信息,请参见

如果此代码与其他纹理(即,
glBindTexture
的其他参数)一起工作,可能值得检查如何创建此特定纹理。首先,(210638)在笛卡尔坐标系中位于右上角。如果其他纹理工作,则此纹理可能是奇数大小或不同格式,并且在没有观察到一些必要的填充物的情况下加载。@JasonD更重要的是,纹理是199x200。我高度怀疑读取纹理的代码中存在错误。谢谢JasonD,这确实是一个奇怪的大小问题。我简直不敢相信我花了几个小时来解决这个问题。像素对齐的考虑因素与NPOT格式无关。例如,如果您有RGB像素(即没有alpha通道),则无论NPOT与否,都无法进行4字节对齐。此外,glu_-One是相当罕见的。只要写“1”。GL\u PACK\u对齐用于从OpenGL(glReadPixels)获取图像数据,您不需要设置它来上载纹理。@datenwolf更改了我的答案。谢谢从未说过他应该使用
glu One
,这只是一个示例代码。好吧,
GL\u One
甚至不是一个标准令牌,无论从何处获得,它都不是原始的OpenGL规范
GL_ONE
(大写字母)存在,但这是针对
glBlendFunc
的。而且既没有一个
glu-Two
,也没有一个
GL-Two
。请将其更改为数字文字。@datenwolf抱歉,我忘了使用.NET包装器定义它们
public enum PixelStoreValue:int{One,Two,Four}
。只是将其更改为
GL_One
,因为我认为在OpenGL中也使用了GL_One。在.net中使用此枚举是有意义的,因为这强制了此特定参数的强静态类型化。如果你看看其他强静态类型语言(如Haskell、OCaml、Go等)中的OpenGL包装器,你会发现类似的枚举。问题是没有设置像素对齐,请参阅Felix K.的答案。没有必要使尺寸均匀。抱歉,但在这种形式下,你的答案似乎不正确。请把它修好。