c++ - 现代 OpenGL : VBO, GLM 和矩阵堆栈

标签 c++ opengl matrix glsl vbo

为了升级我现有的项目而搜索和阅读有关现代 OpenGL 的内容后,我有点困惑,因为我的 3D 框架基于 OpenGL 2.1。

据我所知...

  • 我们需要从顶点、索引、法线、颜色、uv 等生成我们的顶点缓冲区对象。

  • 然后我们可以使用 GLM 进行矩阵变换,我们只使用 VBO 来创建或操作网格,最后我们像这样将所有内容传递给 GLSL 顶点着色器...

    glm::mat4 MVP = projection * view * model;
    glUniformMatrix4fv(glGetUniformLocation(shaderProgramID, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); //or &MVP[0][0]
    
    // uniform mat4 MVP;
    // in vec3 Vertex;
    // void main(void)
    // {
    //    gl_Position = MVP * vec4(Vertex, 1.0); //instead of ftransform();
    // }
    

问题:我们如何在没有 pushMatrix/popMatrix 的情况下进行分层转换? (或者也许我们可以使用我们的 VBO 进行层次转换,这可能吗?)

如果不可能,那么如何使用GLM和C++ 库实现与pushMatrix/popMatrix相同的结果?

假设我需要这样的东西:

> Set identity
> Translate to X, Y, Z
> Draw Mesh 1
> Rotate 0.5 by X axis
> Draw Mesh 2
> Scale down to 0.1
> Draw Mesh 3

最佳答案

  • We need to generate our Vertex-Buffer-Objects from vertices, indices, normals, colors, uvs, etc.

并不是真的必须使用 VBO,客户端顶点数组也可以。但是,强烈建议使用 VBO,因为它使驱动程序的生活更轻松,从长远来看,您也可以作为必须处理数据的人。代码开销可以忽略不计(与生成和上传纹理数据大致相同)并且性能只会提高。

  • then we can use GLM for matrix transformation, and we only use VBO to create or manipulate meshes, finally we pass everything into GLSL vertex shader like this...

您不仅限于 GLM。任何矩阵数学库都可以。如果您正在寻找可以在 C99 中使用的东西,请查看我的(仍然不完整)linmath.h https://github.com/datenwolf/linmath.h这只是一个带有 static inline 函数的头文件。我还没有对代码重复是否对性能产生负面影响(代码大小会造成 L1 缓存压力)进行基准测试。

QUESTION: How we do hierarchical transformations without pushMatrix/popMatrix? (or maybe we do hierarchical transformation by using our VBOs, is it possible?)

IBO 与此无关。给大多数老式 OpenGL 用户带来麻烦的是那些矩阵堆栈函数,它们使 OpenGL 看起来有点像场景图。但事实并非如此。

如果您忘记了旧 OpenGL 的矩阵堆栈,那么如何进行层次转换就变得显而易见:在层次结构的每个分支处复制转换矩阵并对其进行操作。你得到一个层次化的转换树,在每个节点存储相应的矩阵。然后将这些矩阵作为制服传递给顶点着色器;或者,如果您要绘制只有一个变换的刚性对象,则只需一个矩阵。多个矩阵通常只需要像这样的角色的骨骼动画这样的变形

worldtransform -> 
    pelvis ->
        left upper leg -> left lower leg -> left foot
        right upper leg -> right lower leg -> right foot
    torso ->
        neck -> head ->
             left eye
             right eye
             facial deformation // this is a whole chapter of it's own
        left upper arm -> left lower arm -> left hand
        right upper arm -> right lower arm -> right hand

每次在这样的层次结构中遇到 -> 时,您都会复制矩阵并继续处理该矩阵。当返回到树的更高级别时,您将再次从该矩阵开始工作。

关于c++ - 现代 OpenGL : VBO, GLM 和矩阵堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8951509/

相关文章:

c - openGL 2D鼠标点击位置

c++ - 使用顶点着色器确定线方向

matlab - 4x4 矩阵的正交性

r - 字符矩阵-如何按行运算?

arrays - 遍历 3D 数组的算法复杂度

c++ - 读取文件并保存在istream C++中

c++ - C/C++ - 如何从网络上逐字节下载(如文件流)?

c++ - 从 std::shared_ptr 窃取位

c - C Opengl 过剩中的错误 'glutTimerfunc'

c++ - 空结构是由 C++ 标准定义的吗?