2010-06-06 30 views
5

Tôi đang cố gắng để tạo ra kết cấu như sau:GlGenTextures tục trả lại đơn 0 của

#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]; 
} 

Nhưng khi tôi kiểm tra các giá trị của texName [0] và [1] họ đều 0, tôi không hiểu tại sao, tôi đang làm gì sai. Cảm ơn.

+0

Đó có phải là hàm duy nhất không thành công? – jalf

+0

Không, những thứ khác cũng không thành công, tôi gọi init() sau khi thiết lập ngữ cảnh của tôi ... – jmasterx

+1

bạn đã xác minh rằng bạn đã thành công trong việc thiết lập ngữ cảnh chưa? –

Trả lời

8

Hãy thử gọi glGetError. Nó sẽ cho bạn biết chi tiết hơn những gì đã xảy ra. Nói chung, nếu một chức năng OpenGL thất bại, điều đầu tiên bạn nên làm là hỏi OpenGL tại sao nó thất bại. Nó biết, bởi vì nó chỉ cố gắng thực thi hàm.

Sẽ khó khăn hơn nhiều nếu chúng tôi đoán được điều gì có thể đã xảy ra.

+0

Tôi nhận được lỗi 1282, đó là gì? – jmasterx

+3

Sử dụng 'gluErrorString()' để tìm hiểu. :) http://www.opengl.org/wiki/FAQ#glGetError_.28or_.22How_do_I_check_for_GL_errors.3F.29 – jalf

+0

"hoạt động không hợp lệ" – jmasterx

18

Có thể bạn đang gọi glGenTextures trước khi tạo ngữ cảnh OpenGL và điều đó sẽ tạo ra lỗi GL. Đừng cố tạo họa tiết trước khi bạn khởi tạo OpenGL.

+0

Vâng, đó là 1 trong số các vấn đề của tôi, tôi cũng đang gọi wglmakecurrent trong vòng lặp render của tôi đã gây ra sự cố – jmasterx

+0

Bạn chỉ cần tiết kiệm cho tôi 1 đêm không ngủ – 5argon

+0

Cảm ơn! Bạn đã cứu cuộc đời tôi! –

11

Tôi có vấn đề này, và glGetError() được trở về 0.

Trong trường hợp của tôi nó được gây ra bằng cách gọi glGenTextures(...) trên một sợi khác nhau đối với một bối cảnh GL đã được tạo ra trên (vì tôi đã tải các kết cấu không đồng bộ) . Gọi nó từ chủ đề chính sau tải không đồng bộ được thực hiện glGenTextures(...) bắt đầu hoạt động trở lại.

0

Trong trường hợp của tôi, tôi đã "tải chậm" kết cấu của mình, vì vậy glGenTexture nằm trong lệnh glBegin/glEnd!

-1

trước khi gọi glGenTexture, ngữ cảnh của bạn phải được tạo và XXXMakeCurrent'ed

Các vấn đề liên quan