好的,所以我制作了一个处理基本 OpenGL 渲染的库。它包含三个缓冲区,一个用于顶点、uv 和法线。在主渲染函数中,我绑定(bind)缓冲区,启用顶点属性,然后调用 glDrawArrays()。但是我遇到了一个意想不到的问题,它更多地基于工程而不是基于代码,即我一次只能绑定(bind)一个纹理。所以当我绘制它们时所有的顶点都会有相同的纹理,我该如何解决这个问题?如果您需要更多资源,我会发布。
主要渲染函数
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,this->_VBO);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER,this->_TBO);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER,this->_NBO);
glDrawArrays(GL_TRIANGLES,0,this->polyCount);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
缓冲区:
//Designated Vertex Buffer
std::array<GLfloat,BUFFER_SIZE> BUFFER_1;
UINT bufferIndex1;
//Designated Normal Buffers
std::array<GLfloat,BUFFER_SIZE> BUFFER_2;
UINT bufferIndex2;
//Designated UV Buffer
std::array<GLfloat,BUFFER_SIZE> BUFFER_3;
UINT bufferIndex3;
最佳答案
我们通常在这里做的是按“ Material ”将网格分成子网格。具有不同纹理的对象在技术上是不同的 Material ,因此您将单独渲染它。您可以通过使用称为 Atlas 的东西使用多个纹理渲染单个网格。也就是说,您将纹理打包到单个位图中,并根据要使用的纹理在该位图中选择纹理坐标。
关于c++ - OpenGL 纹理加载困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206862/