2012-02-02 25 views
5

Tôi đã vẽ thành công đa giác đa kết cấu nhưng tiếc là chỉ có pixel đầu tiên của kết cấu lớp phủ đang được sử dụng trên toàn bộ vùng kết cấu.OpenGL, GL_MODULATE và Multitexturing

Dưới đây là các kết cấu (GL_TEXTURE0 và GL_TEXTURE1):

iconoverlay

Kết quả là thế này:

result

Chỉ pixel màu đỏ ở phía trên đang được sử dụng. Tôi đã thử chỉ với một pixel 1x1 màu xanh trên đầu và tôi nhận được kết quả tương tự với lớp phủ màu xanh lam.

Mã của tôi:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glDisableClientState(GL_COLOR_ARRAY); 

const CGPoint vertices[] = { 
    ccp(0,0), 
    ccp(100,0), 
    ccp(0,100), 
    ccp(100,100), 
}; 

// This will flip the image for us as well 
const CGPoint coordinates[] = { 
    ccp(0,1), 
    ccp(1,1), 
    ccp(0,0), 
    ccp(1,0), 
}; 

// Config multitextures 
glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, icon.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

glClientActiveTexture(GL_TEXTURE1); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, overlay.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

GLubyte points = 4; 

// Draw the square 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, points); 

// Revert back 
glActiveTexture(GL_TEXTURE1); 
glDisable(GL_TEXTURE_2D); 

// glClientActiveTexture(GL_TEXTURE0); // breaks multitexturing 
glActiveTexture(GL_TEXTURE0); 
glEnable(GL_TEXTURE_2D); 

glEnableClientState(GL_COLOR_ARRAY); 

Đây là một vấn đề OpenGL, nhưng dự án iOS có sẵn ở đây cho những người quan tâm: http://dl.dropbox.com/u/33811812/cocos2d/OpenGLTest.zip

EDIT: Từ Sách đỏ:

Nếu bạn đa xử lý và bạn sử dụng glTexCoord *(), bạn đang đặt kết cấu coo rdinates cho đơn vị kết cấu đầu tiên. Nói cách khác, sử dụng glTexCoord *() là tương đương với sử dụng glMultiTexCoord * (GL_TEXTURE0, ...)

Bất kỳ gợi ý như thế nào để vượt qua một loạt các tọa độ? OpenGL ES 1.1 không hỗ trợ glBegin(), v.v.

+2

Có vẻ như bạn đang tìm kiếm [glClientActiveTexture] (http://www.opengl.org/sdk/docs/man/xhtml/glClientActiveTexture.xml). –

+0

Rực rỡ! Hoạt động, ngoại trừ việc thiết lập 'glClientActiveTexture (GL_TEXTURE0);' sau khi vẽ làm cho nó thất bại một lần nữa. Tôi có các phương pháp vẽ khác mà tôi cần phải hoàn nguyên các trạng thái. Làm thế nào điều này có thể đạt được? –

+0

Tôi cũng đã xem xét 'glVertexAttribPointer' nhưng tôi không có đầu mối làm thế nào để sử dụng điều này để xác định tọa độ cho GL_TEXTURE1 ... –

Trả lời

6

Cuối cùng! Giải pháp là tôi đã phải làm ba việc:

  • Sử dụng glClientActiveTexture (GL_TEXTURE *) cho 0 và 1 trước khi glTexCoordPointer
  • Sử dụng glEnableClientState (GL_TEXTURE_COORD_ARRAY) cho mỗi kết cấu cũng
  • Hoàn nguyên lại glClientActiveTexture (GL_TEXTURE0) để tránh xung đột với tiếp tục thu hút

Dưới đây là đoạn code mà hoạt động:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glDisableClientState(GL_COLOR_ARRAY); 

const CGPoint vertices[] = { 
    ccp(0,0), 
    ccp(100,0), 
    ccp(0,100), 
    ccp(100,100), 
}; 

// This will flip the image for us as well 
const CGPoint coordinates[] = { 
    ccp(0,1), 
    ccp(1,1), 
    ccp(0,0), 
    ccp(1,0), 
}; 

// Config multitextures 
glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, icon.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

glClientActiveTexture(GL_TEXTURE1); 
glActiveTexture(GL_TEXTURE1); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, overlay.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

GLubyte points = 4; 

// Draw the square 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, points); 

// Revert back 
glActiveTexture(GL_TEXTURE1); 
glDisable(GL_TEXTURE_2D); 

glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glEnable(GL_TEXTURE_2D); 

glEnableClientState(GL_COLOR_ARRAY); 
.210

Và kết quả:

works