无法在opengl es 2.0中加载多个纹理

时间:2011-07-11 12:34:55

标签: ios opengl-es textures

我正在尝试加载两个纹理并将它们传递给我的着色器中的两个采样器,但是两个采样器都返回我加载的第一个纹理。此外,如果我没有将纹理加载到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。

编辑: 这就是我尝试加载和设置两个纹理的方法

        //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);

结果是两个采样器都返回“法线”图像。

LoadTextureData,采样器ID的分配以及我的着色器可以在http://paste2.org/p/1514200

找到

3 个答案:

答案 0 :(得分:4)

缺点:确保在加载着色器后为采样器指定纹理。我被欺骗认为制服[]被正确分配,因为我只是在所有装载完成后才检查它。

答案 1 :(得分:3)

GLuint texture1;
glGenTextures(2, &texture1);

您生成两个纹理,但仅为一个纹理分配。

试试这个:

GLuint textures[2];
glGenTextures(2, textures);

答案 2 :(得分:2)

这恰好发生在我身上,我花了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。

应该是:

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

不仅GL_TEXTURE0和GL_TEXTURE1使其成为第二个纹理。它也就是那个。

希望能在几个小时内拯救别人。