GlGenTextures保持0的回归

jma*_*erx 7 c c++ opengl

我正在尝试生成这样的纹理:

#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLubyte otherImage[checkImageHeight][checkImageWidth][4];

static GLuint texName[2];

void makeCheckImages(void)
{
    int i, j, c;

    for (i = 0; i < checkImageHeight; i++) {
        for (j = 0; j < checkImageWidth; j++) {
            c = ((((i&0x8)==0)^((j&0x8))==0))*255;
            checkImage[i][j][0] = (GLubyte) c;
            checkImage[i][j][1] = (GLubyte) c;
            checkImage[i][j][2] = (GLubyte) c;
            checkImage[i][j][3] = (GLubyte) 255;
            c = ((((i&0x10)==0)^((j&0x10))==0))*255;
            otherImage[i][j][0] = (GLubyte) c;
            otherImage[i][j][1] = (GLubyte) 0;
            otherImage[i][j][2] = (GLubyte) 0;
            otherImage[i][j][3] = (GLubyte) 255;
        }
    }
}
void init(void)
{    
    glClearColor (1.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);

    makeCheckImages();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glGenTextures(2, texName);
    glBindTexture(GL_TEXTURE_2D, texName[0]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
        GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,
        checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
        checkImage);

    glBindTexture(GL_TEXTURE_2D, texName[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
        GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);   
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, 
        checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
        otherImage);
    glEnable(GL_TEXTURE_2D);

    engineGL.current.tex = texName[1];
}
Run Code Online (Sandbox Code Playgroud)

但是当我检查texName [0]和[1]的值时它们都是0,我不明白为什么,我做错了什么.谢谢.

Mat*_*gro 20

您可能在创建OpenGL上下文之前调用glGenTextures,这将生成GL错误.在初始化OpenGL之前不要尝试创建纹理.


And*_*yld 14

我有这个问题,并glGetError()返回0.

在我的情况下,它是通过调用glGenTextures(...)与创建GL上下文的线程不同的线程引起的(因为我是异步加载纹理).在异步加载之后从主线程调用它glGenTextures(...)再次开始工作.


jal*_*alf 8

试着打电话glGetError.它应该更详细地告诉你出了什么问题.一般来说,如果一个OpenGL函数失败,你要做的第一件事就是问OpenGL失败的原因.它知道,因为它只是试图执行该功能.

我们更难猜测可能出错的地方.

  • 使用`gluErrorString()`找出答案.:) http://www.opengl.org/wiki/FAQ#glGetError_.28or_.22How_do_I_check_for_GL_errors.3F.29 (3认同)
  • (文档)[http://www.opengl.org/sdk/docs/man/xhtml/glGenTextures.xml]提到"如果在执行glBegin和相应的glEnd执行之间执行glGenTextures,则会生成GL_INVALID_OPERATION." .这对你有帮助吗? (2认同)