首先让我们看看我的代码为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;问题是什么?另一个问题是我们需要一个程序来创建,链接和使用我们需要或不需要的每个纹理吗?如果您需要更多细节,请告诉我。
答案 0 :(得分:0)
更重要的是,你继续前进的方式看起来不对。
我的建议是目前只处理一个纹理单元(你没有真正做多纹理,每个对象只有一个纹理)。
换句话说,不要改变统一的glUniform1i(1,1); glUniform1i(1,0);但总是指纹理单位0。
另一点,你怎么能确定制服1是片段着色器的sampler2D的ID?
最好的方法是在编译并链接顶点+片段着色器之后获取制服的ID。这是要走的路。制服的ID由司机管理,您无法确定该ID是0还是1或2等。
这就是为什么在Opengl中存在函数glGetUniformLocation的原因。使用它,它更加安全和正确。
目前,另一种解决方案是仅激活纹理单元0 glActiveTexture(GL_TEXTURE0);并在着色器中使用sample2D 0。性能压力不应该代表当前设置中的问题。
我希望这会有所帮助。 莫里吉奥