多纹理openGL es2.0原语未显示

时间:2014-03-26 14:29:19

标签: c++11 opengl-es-2.0

首先让我们看看我的代码为playercar Render:

glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, this->texture2DObj);
    glUniform1i(1, 0);
    glBindBuffer(GL_ARRAY_BUFFER, this->vertexBuffer);
    glEnableVertexAttribArray(0);
    int offset = 0;
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, this->vertexBufferSize,(const void *)offset);//???????????

    offset += 3 * sizeof(GLfloat);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, this->vertexBufferSize, (const void*)offset);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->indexBuffer);
    glDrawElements(GL_TRIANGLES, this->indexBufferSize, GL_UNSIGNED_SHORT, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

和另一个我希望在程序名称oppCar_1中加载的纹理:

glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, this->textureObj);
    glUniform1i(1, 1);
    int offset = 0;
    glBindBuffer(GL_ARRAY_BUFFER, this->vertexBufferOppCar_1);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, this->vertexBufferSizeOppCar_1, (const void *)offset);
    glEnableVertexAttribArray(1);
    offset += 3 * sizeof(GLfloat);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, this->vertexBufferSizeOppCar_1, (const void *)offset);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->indexBufferOppCar_1);
    glDrawElements(GL_TRIANGLES, this->indexBufferSizeOppCar_1, GL_UNSIGNED_SHORT, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

这是我的渲染功能:

glUseProgram(ShaderProgram::ProgramObject);
    glClearColor(0.0, 0.0, 0.0, 1.0);
    score++;
    glClear(GL_COLOR_BUFFER_BIT);
    //oppcar_1.SetPosition(posCar);
    playercar.Render();
    oppcar_1.Render();

但它只显示一个纹理!当我将玩家汽车中的glActiveTexture(GL_TEXTURE0)更改为任何大于0的数字时,它会改变为它对于oppCar的下一个纹理,因此我看到纹理被完美加载但没有显示两个纹理,所以&# 39;问题是什么?另一个问题是我们需要一个程序来创建,链接和使用我们需要或不需要的每个纹理吗?如果您需要更多细节,请告诉我。

1 个答案:

答案 0 :(得分:0)

抱歉,我不明白为什么以及为谁传递制服" glUniform1i(1,0);"。制服用于着色器,因此在调用glUseProgram(ShaderProgram :: ProgramObject)之后应该分配制服;

更重要的是,你继续前进的方式看起来不对。

我的建议是目前只处理一个纹理单元(你没有真正做多纹理,每个对象只有一个纹理)。

换句话说,不要改变统一的glUniform1i(1,1); glUniform1i(1,0);但总是指纹理单位0。

另一点,你怎么能确定制服1是片段着色器的sampler2D的ID?

最好的方法是在编译并链接顶点+片段着色器之后获取制服的ID。这是要走的路。制服的ID由司机管理,您无法确定该ID是0还是1或2等。

这就是为什么在Opengl中存在函数glGetUniformLocation的原因。使用它,它更加安全和正确。

目前,另一种解决方案是仅激活纹理单元0 glActiveTexture(GL_TEXTURE0);并在着色器中使用sample2D 0。性能压力不应该代表当前设置中的问题。

我希望这会有所帮助。 莫里吉奥