gpt4 book ai didi

c++ - OpenGL大项目,VAO-s等

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:05 25 4
gpt4 key购买 nike

所以我一直在https://open.gl/上学习OpenGL 3.3,我对某些东西感到非常困惑。

  • VAO-s。据我了解,它们用于存储glVertexAttribPointer调用。
  • VBO-s。他们存储证明。因此,如果我要用多个对象制作东西,是否每个对象都需要一个VBO?
  • Shader程序-为什么我们需要多个程序,它们究竟是做什么的?
  • 这行代码的确切作用是:glBindFragDataLocation(shaderProgram,0,“outColor”);

  • 最重要的是,所有这些如何适应大型程序? VAO-s到底用于什么用途?大多数教程仅涉及使用硬编码顶点绘制一个2或2立方体的内容,那么如何去管理带有许多对象的场景呢?我已经阅读了 this线程,并对场景管理的发生方式有一点了解,但我仍然无法弄清楚如何将OpenGL东西连接到这一切。

    最佳答案

    1-是的。 VAOs通常存储顶点数组绑定(bind)。当您看到要启用,禁用和更改GPU状态的大量调用时,您可以在程序的某个早期阶段完成所有这些操作,然后使用VAO进行绑定(bind)内容的“快照”在那个时间点不是。稍后,在实际的绘制调用期间,您需要做的就是再次绑定(bind)该VAO以将所有顶点状态设置为当时的状态。就像VBOs在立即模式下更快一样,因为它们一次发送所有顶点,所以VAOs通过一次更改许多顶点状态来更快地工作。

    2-VBO只是将glPositionglColor ..etc坐标发送到GPU以便在屏幕上呈现的另一种方式。与立即模式不同,即时模式是通过gl*Attribute*调用一个接一个地发送顶点数据,其想法是,提前将所有顶点上传到GPU并以ID的形式获取其位置。在渲染时,您只需要将GPU指向该位置(将VBO id绑定(bind)到GL_ARRAY_BUFFER之类的东西,并使用glVertexAttribPointer来指定如何存储顶点数据的详细信息)并发出渲染命令。这样做显然可以节省大量时间,因此速度要快得多。

    至于每个对象应具有一个VBO还是所有对象甚至应具有一个VBO,取决于程序员和他们要呈现的对象的结构。毕竟,VBOs本身只是存储在GPU中的一堆数据,您可以使用glVertexAttribPointer调用告诉计算机它们的排列方式。

    3着色器用于定义流水线(例程),这些流水线是顶点,颜色,法线等在被发送到GPU之后直到在屏幕上呈现为片段或像素之前发生的情况。将顶点发送到GPU时,它们通常仍然是3D坐标,但是屏幕是2D像素点。仍然存在根据ProjectionModelView矩阵(顶点着色器的工作)重新定位这些顶点,然后将3D几何图形(几何着色器)“展平”或栅格化为2D平面的过程。然后,为着色的2D场景(片段着色器)着色,并最终相应地照亮屏幕上的像素。在OpenGL 1.5和更低版本的内核中,您对这些阶段没有太多控制权,因为它们都是固定的(因此为fixed pipeline)。只要考虑一下在任何这些着色器阶段中可以做什么,您就会发现可以使用它们完成很多很棒的事情。例如,在片段着色器中,在将片段颜色发送到GPU之前,将颜色的符号取反,然后加1以使用该着色器渲染的对象的颜色反转!

    至于需要使用多少个着色器,还是要由程序员决定是否要使用多个着色器。他们可以将所需的所有功能合并到一个大型巨型着色器( super 着色器)中,并使用 bool(boolean) uniforms(经常被认为是不好的做法)来开启和关闭这些功能,或者让每个着色器都做某件事并绑定(bind)正确的着色器根据他们的需要。

    What exactly does this line do : glBindFragDataLocation(shaderProgram, 0, "outColor");



    这意味着在片段着色器执行结束时,存储在 out声明的变量“outColor”中的任何内容都将作为最终的主要片段颜色发送到GPU。

    The most important thing is how does all of this fit into a big program? For what exactly are used the VAO-s? Most tutorials just cover the things just to drawing a cube or 2 with hard coded vertices, so how would one go to managing scenes with a lot of objects? I've read this thread and got a little bit of understanding on how the scene management happens and all but still I can't figure out how to connect the OpenGL stuff to it all.



    它们都可以一起在屏幕上绘制漂亮的彩色形状。 VBO s是存储场景顶点的结构(全部以丑陋的方式对齐), VertexAttribPointer调用以告诉GPU VBO中的数据是如何排列的, VAO s用于提前存储所有这些 VertexAttribPointer指令并发送通过在主循环中的渲染过程中简单地绑定(bind)一个,可以一次性将它们全部绑定(bind)在一起,并使用着色器在屏幕上绘制场景的过程中为您提供更多控制。

    乍一看,所有这些听起来都是令人难以置信的,但是通过实践,您会习惯的。

    关于c++ - OpenGL大项目,VAO-s等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720219/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com