c++ - OpenGL 纹理加载困境

标签 c++ opengl glsl

好的,所以我制作了一个处理基本 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/

相关文章:

python - 如何在 MacOS 上使用 QGLFormat 更改 OpenGL 版本?

java - OpenGL 相机位置与渲染图像不匹配

c++ - 如果未绑定(bind),统一值是否保留在 GLSL 着色器中?

c++ - 启用 MSAA 时,会出现伪影并且边缘上的纹理查找失败

c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题

c++ - 最小构建依赖树

c++ - 为什么这个虚拟析构函数在 C++ 中不起作用?

xcode - MacOS Mojave Xcode 10 + OpenGL 在初始化窗口后未绘制

c++ - 模板类的重载/特化方法

c++ - QT Creator C++ 不为一项生成 ui_.h 文件