C++ 简单OpenGL纹理贴图不工作?

C++ 简单OpenGL纹理贴图不工作?,c++,opengl,textures,C++,Opengl,Textures,我试图在OpenGL中找到纹理映射,但我找不到一个简单的例子 正在绘制多边形,但它没有纹理,只是纯色。此外,位图正在正确加载到sprite1[],因为到目前为止,我已经成功地使用了glDrawPixels 我使用glGenTextures来获取我的tex名称,但我注意到它并没有改变texName1;这个GLuint是我初始化它的任何东西,即使在调用glGenTextures之后 我已启用GL_纹理_2D 代码如下: GLuint texName1 = 0; glGenTextures(1, &

我试图在OpenGL中找到纹理映射,但我找不到一个简单的例子

正在绘制多边形,但它没有纹理,只是纯色。此外,位图正在正确加载到sprite1[],因为到目前为止,我已经成功地使用了glDrawPixels

我使用glGenTextures来获取我的tex名称,但我注意到它并没有改变texName1;这个GLuint是我初始化它的任何东西,即使在调用glGenTextures之后

我已启用GL_纹理_2D

代码如下:

GLuint texName1 = 0;

glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);

glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (0.0, 0.0, -5.0f);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (.5, 0.0, -5.0f);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (.5, .5, -5.0f);
    glTexCoord2f (0.0, 1.0);
    glVertex3f (0.0, .5, -5.0f);
glEnd();
更新: 我不知所措。以下是我尝试过的一切:

  • 原来我是在初始化OGL之前初始化纹理的。纹理在类构造函数中初始化(glGenTextures->glTexImage2D),并在每个帧调用的成员函数中绘制(glBegin->glEnd)。genTextures现在似乎工作正常,我的名字是1

  • GL_RGBA8、GL_BGRA_EXT的所有可能组合(GL_BGRA在我的系统上不工作;我需要_EXT),我甚至从位图中删除了alpha通道,并尝试了GL_RGB、GL_BGR_EXT等的所有组合。运气不好

  • 尝试按程序创建位图并使用该位图

  • 确保未启用GL_颜色_材质

  • 将位图大小更改为32x32

  • 尝试了glTexEnvi而不是glTexEnvf

  • 一些随意的想法:

    • GL_颜色_材质可能已启用
    • 将“glTexEnvf”更改为“glTexEnvi”,看看这是否有帮助
    • 如果在glGenTextures之后texName1为0,则可能没有活动的OpenGL上下文

    对于错误检查,我建议编写一个小函数,用于打印glGetErrors中最常见结果的可读输出,并使用该函数查找创建错误的行。另一种可能是使用,或。

    我要检查的第一件事是颜色材质设置,如ShadowIce所述,然后检查纹理文件以确保其大小合理(如256x256)和RGB位图。如果文件有一点小问题,无论您如何尝试,它都无法正确渲染

    然后,我将不再尝试调试代码,而是查看您与


    NeHe总是一个很好的地方,可以检查您是否正在尝试使用OpenGL进行操作。纹理可能是最难处理的,而且随着你其他GL技能的提高,它们只会变得更加困难。

    我的OpenGL已经生锈了,但我记得在
    glTexImage2D上也有同样的问题
    . 最后,我终于成功了,但我总是在
    gluBuild2DMipmaps
    所以我最终得到了

    gluBuild2DMipmaps (
      GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
    );
    
    取代

    glTexImage2D (
      GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
    );
    

    在你的评论中,你说你的位图是29x20像素。为了生成有效的纹理,OpenGL要求图像大小(每个维度上)为2的幂。它不需要是正方形,但可以是矩形。您可以通过使用一些OpenGL扩展来克服这一问题,例如。

    除了两个纹理维度的非幂之外,您还提到了纹理名称生成,但没有更改名称


    听起来好像您调用
    ()
    太早了,即在初始化OpenGL之前。如果您没有,那么我建议在调用检查OpenGL错误状态的
    glGenTextures()
    之后添加代码,通过调用

    我发现了问题。我对glEnable的调用是
    glEnable(GL|U BLEND | GL|U TEXTURE_2D)
    。使用glGetError,我看到我得到了一个GL_INVALID_枚举用于此调用,所以我将GL_TEXTURE_2D移动到了它自己的enable函数和bingo。我想格伦布尔不允许逻辑还是逻辑

    我将把这个放在这里,因为我有同样的问题,并找到了另一篇解释这个问题的帖子。 iPhone确实支持GL_BGRA(GL_EXT_BGRA),但似乎只是作为输入格式,而不是内部格式。因此,如果您将glTexImage2D调用更改为具有GL_RGBA的内部格式,那么它就可以工作

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]);
    

    我希望这能帮助其他偶然发现这篇文章的人。

    如果在glGenTextures之后texName1仍然为0,你应该检查你的错误条件……宽度和高度在sprite1[]中存储为byte还是int?宽度和高度存储为byte little endian。我曾经在glDrawPixels中成功使用过sprite1[18]和sprite1[22];他们是正确的。位图只有29x20像素,因此可以正常工作。另外,如何检查错误条件?从参考页面中,我看不到glGenTextures使用glGetError()生成任何对我有用的错误。这听起来像是MIN筛选器中忘记的Gltex参数。默认设置为GL_NEAREST_MIPMAP_LINEAR,它只适用于MIPMAP纹理。我很想听到更多关于这方面的内容,因为这让我感到困惑。将BGRA作为内部格式似乎是可行的,但实际上它使用的是RGBA。还是我弄错了?一个AIK OpenGL常量不仅仅是二的幂,它们是任意值。这意味着使用逻辑OR会破坏信息。或可启用的常量是名称中带-位的常量,如GL\u COLOR\u BUFFER\u位。在GL中没有太多的纹理,所以不要习惯。这对我很有用…我在OpenGL初始化之前尝试创建纹理。正如我一次又一次地看到的:函数调用的顺序在OpenGL编程中非常重要。GL_ARB_texture_rectangle从2.0开始就被合并到OpenGL中,