Проблема мультитекстурирования (новичок) - PullRequest
3 голосов
/ 15 января 2011

Я новичок в OpenGL и мобильном программировании в целом.

Я пытаюсь загрузить 2 текстуры и показать их на одном объекте (я имею в виду один набор вершин) с разными координатами.

Мой подход:

glGenTextures(2, &textures[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glActiveTexture(GL_TEXTURE0);
glClientActiveTexture( GL_TEXTURE0 );
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexCoordPointer(2, GL_SHORT, 0, mapTextCoords);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, map.width, map.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, [map getByteData]);

glActiveTexture(GL_TEXTURE1);
glClientActiveTexture( GL_TEXTURE1 );
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexCoordPointer(2, GL_SHORT, 0, backgroundTextCoords);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, background.width, background.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, [background getByteData]);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, mapVertices);

Что я делаю не так?И что мне делать дальше?

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glDrawArrays(GL_TRIANGLE_STRIP, 0, BYTES_PER_PIXEL);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

В результате я получил белый объект (без текстур вообще).

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Попробуйте предоставить полный набор mip-карт, если вы собираетесь использовать GL_TEXTURE_MIN_FILTER по умолчанию из GL_NEAREST_MIPMAP_LINEAR.

Или установите GL_TEXTURE_MIN_FILTER на GL_NEAREST / GL_LINEAR.

0 голосов
/ 10 февраля 2017

Для инициализации попробуйте:

glGenTextures(1, &texA);
glBindTexture(GL_TEXTURE_2D, texA);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_t, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, lod, GL_RGB, pixWidth, pixHeight, 0, GL_RGB, GL_FLOAT, pixelData);
glGenerateMipmap(GL_TEXTURE_2D);

Измените вышеперечисленное в соответствии с вашими потребностями и повторите для второй текстуры.

Для рисования попробуйте:

// Bind textures
glActiveTexture(GL_TEXTURE0+i);        // set which texture unit will be affected by subsequent glBindTexture
glBindTexture(GL_TEXTURE_2D, texA);    // bind a 2D texture
glActiveTexture(GL_TEXTURE0+i);        // set a different texture unit than above
glBindTexture(GL_TEXTURE_2D, texB);    // bind another 2D texture

// Set texcoords for first texture
glClientActiveTexture(GL_TEXTURE0+i);  // set which texture unit will be affected by subsequent
                                       // call to glTexCoordPointer (should match what you
                                       // gave glActiveTexture for texA earlier)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);  // enable texcoord attributes
glTexCoordPointer(...);                // pass the texcoord array for texA

// Set texcoords for second texture
glClientActiveTexture(GL_TEXTURE0+i);  // set which texture unit will be affected by subsequent
                                       // call to glTexCoord pointer (should match what you
                                       // gave glActiveTexture for texB earlier)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(...);    // pass the texcoord array for texB

Примечание : не делать то, что вы делаете, передавая GL_TEXTURE1, GL_TEXTURE2 и т. Д., А передавайте GL_TEXTURE0+i, где i - это значение между 0 и зависящим от реализации результатом GL_MAX_TEXTURE_COORDS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...