2010-06-06 2 views
5

Я пытаюсь создать текстуру так:GlGenTextures продолжает returing 0-х

#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, я не понимаю, почему, Что я делаю не так. Благодарю.

+0

Это единственная функция, которая потерпит неудачу? – jalf

+0

Нет, другие вещи тоже терпят неудачу, я вызываю init() после настройки моего контекста ... – jmasterx

+1

Вы подтвердили, что вам удастся настроить свой контекст? –

ответ

8

Попробуйте позвонить glGetError. Он должен рассказать вам более подробно, что пошло не так. В общем случае, если функция OpenGL не работает, первое, что вы делаете, должно состоять в том, чтобы спросить OpenGL, почему она не удалась. Он знает, потому что он просто пытался выполнить функцию.

Нам гораздо сложнее догадаться, что могло произойти неправильно.

+0

Я получаю ошибку 1282, что это? – jmasterx

+3

Используйте 'gluErrorString()', чтобы узнать. :) http://www.opengl.org/wiki/FAQ#glGetError_.28or_.22How_do_I_check_for_GL_errors.3F.29 – jalf

+0

«Недействительная операция» – jmasterx

18

Вы, вероятно, вызываете glGenTextures перед созданием контекста OpenGL и генерируете ошибку GL. Не пытайтесь создавать текстуры перед инициализацией OpenGL.

+0

Да, это было 1 из моих проблем, я также вызывал wglmakecurrent в моем цикле рендеринга, который вызывал проблемы – jmasterx

+0

Ты просто спаси меня 1 ночь без сна – 5argon

+0

Спасибо! Вы спасли мою жизнь! –

11

Я имел эту проблему, и glGetError() возвращаются 0.

В моем случае это было вызвано вызовом glGenTextures(...) на другой поток в один контекст GL был создан (потому что я загружал текстуры асинхронно) , Вызвать его из основной нити после асинхронная нагрузка glGenTextures(...) начать работать снова.

0

В моем случае я был «ленивой загрузкой» моей текстуры, поэтому glGenTexture находилась внутри команды glBegin/glEnd!

-1

перед вызовом glGenTexture, ваш контекст OpenGL должен быть создан и XXXMakeCurrent'ed

Смежные вопросы