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):
Kết quả là thế này:
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.
Có vẻ như bạn đang tìm kiếm [glClientActiveTexture] (http://www.opengl.org/sdk/docs/man/xhtml/glClientActiveTexture.xml). –
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? –
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 ... –