Невозможно загрузить несколько текстур в OpenGLES ES 2.0 - PullRequest
3 голосов
/ 11 июля 2011

Я пытаюсь загрузить две текстуры и передать их двум сэмплерам в моем шейдере, однако оба сэмплера возвращают первую загруженную текстуру. Кроме того, если я не загружаю текстуру в GL_TEXTURE0, оба сэмплера возвращают черный цвет. Я уменьшил его до одного сэмплера / текстуры и все еще имею ту же проблему:

    GLuint texture1;

    glGenTextures(2, &texture1);

    glActiveTexture(GL_TEXTURE0); //if this is GL_TEXTURE1 or any other, I get black
    glBindTexture(GL_TEXTURE_2D, texture1);
    glEnable(GL_TEXTURE_2D);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    [self LoadTextureData: [[NSBundle mainBundle] pathForResource:@"normals" ofType:@"png"]];

    glUniform1i(uniforms[SAMPLER_1], 1); //whether this is 0 or 1 or anything else doesn't seem to make any difference for both samplers. 

    return TRUE;

Есть идеи, что я делаю не так? Я вполне уверен, что мои показатели сэмплера верны, как и мой шейдер. LoadTextureData сводится к glTexImage2D.

Edit: Вот как я пытаюсь загрузить и установить две текстуры

        //texture 1
    GLuint texture1;

    glGenTextures(1, &texture1);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture1);
    glEnable(GL_TEXTURE_2D);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    [self LoadTextureData: [[NSBundle mainBundle] pathForResource:@"normals" ofType:@"png"]];

    //texture 2
    GLuint texture2;

    glGenTextures(1, &texture2);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, texture2);
    glEnable(GL_TEXTURE_2D);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


    [self LoadTextureData: [[NSBundle mainBundle] pathForResource:@"bricks" ofType:@"jpg"]];


    glUniform1i(uniforms[SAMPLER_1], 0);
    glUniform1i(uniforms[SAMPLER_2], 1);

В результате оба сэмплера возвращают изображение 'normals'.

LoadTextureData, назначение идентификаторов сэмплера и мой шейдер можно найти по адресу http://paste2.org/p/1514200

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Короче говоря: убедитесь, что вы назначаете текстуры сэмплерам - после того, как шейдер загружен.Я был обманут, думая, что униформа [] назначена правильно, потому что я проверял ее только после завершения загрузки.

3 голосов
/ 08 января 2012
GLuint texture1;
glGenTextures(2, &texture1);

Вы генерируете две текстуры, но выделяете переменную только для одной.

Попробуйте это:

GLuint textures[2];
glGenTextures(2, textures);
2 голосов
/ 17 августа 2013

Это только что произошло со мной, и я потратил 2 или 3 часа, чтобы понять это. Ваш ответ был правильным для вас, но это было то, что я делал ...

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureInfo[textureIndex].texture);
glUniform1i(glPrograms[currentProgram].glUniforms[U_textureSampler], 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureInfo[textureIndex].texture);
glUniform1i(glPrograms[currentProgram].glUniforms[U_secondTextureSampler], 0);

Все мои 3 часа отладки, тестирования, ругательства и попыток выяснить, почему ОБА текстуры были одинаковыми ... из-за 0 вместо 1 на 2-м.

Это должно было быть:

glUniform1i(glPrograms[currentProgram].glUniforms[U_secondTextureSampler], 1);

Это не только GL_TEXTURE0 и GL_TEXTURE1, что делает его второй текстурой. Там тоже 1.

Надеюсь, это спасет кого-то еще пару часов.

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