GlGenTextures继续返回0

时间:2010-06-06 17:04:19

标签: 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];
}

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

5 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:12)

我遇到了这个问题,glGetError()正在返回0。

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

答案 2 :(得分:8)

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

我们更难猜测可能出现的问题。

答案 3 :(得分:0)

在我的情况下,我是“懒加载”我的纹理,所以glGenTexture在glBegin / glEnd命令中!

答案 4 :(得分:0)

在调用glGenTexture之前,必须创建你的opengl上下文并且XXXMakeCurrent'ed