Rok*_*ner 2 c++ opengl shader vertex-buffer vertex-array-object
所以我一直在https://open.gl/上学习OpenGL 3.3 ,我对一些东西感到很困惑.
glVertexAttribPointer呼叫.最重要的是这一切如何适合大型项目?究竟是什么用于VAO-s?大多数教程只是为了绘制一个立方体或2个带有硬编码顶点的东西,那么如何管理具有大量对象的场景呢?我已经阅读了这个帖子并且对场景管理的发生方式有了一些了解,但我仍然无法弄清楚如何将OpenGL的东西连接到它.
1 -是的.VAOs通常存储顶点数组绑定.当你看到你正在进行许多调用来启用,禁用和更改GPU状态时,你可以在程序的某个早期点完成所有这些操作,然后使用VAO来获取"快照",即绑定的内容和什么不是,在那个时间点.稍后,在您的实际绘制调用期间,您需要做的就是VAO再次绑定它以将所有顶点状态设置为它们当时的状态.就像VBOs立即模式更快,因为它们一次发送所有顶点,通过一次VAOs更改多个顶点状态来更快地工作.
2,维也纳各组织都只是另一种方式来发送的glPosition,glColor...等坐标到GPU呈现在屏幕上.这个想法是,与立即模式不同,您通过gl*Attribute*调用逐个发送顶点数据,是将所有顶点预先上传到GPU并将其位置作为ID检索.在渲染时,您只需将GPU(您将VBOid 绑定到类似的东西GL_ARRAY_BUFFER,并用于glVertexAttribPointer指定存储顶点数据的方式的详细信息)指向该位置并发出要渲染的订单.这显然可以通过开销来节省大量时间,因此速度更快.
至于是否VBO每个对象应该有一个,或者VBO对于所有对象都应该有一个对象取决于程序员和他们想要渲染的对象的结构.毕竟,VBOs它们只是存储在GPU中的一堆数据,您告诉计算机如何使用这些glVertexAttribPointer调用来安排它们.
3-Shaders用于定义一个管道 - 例程 - 它们在被发送到GPU之后顶点,颜色,法线等发生的情况,直到它们在屏幕上呈现为片段或像素.将顶点发送到GPU时,它们通常仍然是3D坐标,但屏幕是2D像素.仍然存在根据ProjectionModelView矩阵(顶点着色器的作业)重新定位这些顶点然后将3D几何体(几何着色器)"平坦化"或光栅化为2D平面的过程.然后对着平的2D场景(片段着色器)进行着色,最后相应地点亮屏幕上的像素.在OpenGL版本1.5核心及以下版本中,您对这些阶段没有太多控制权,因为它已全部修复(因此称为术语fixed pipeline).想想你可以在任何这些着色器阶段做什么,你会发现你可以用它们做很多很棒的事情.例如,在片段着色器中,就在将片段颜色发送到GPU之前,取消颜色的符号并添加1以使用该着色器反转渲染的对象的颜色!
至于需要使用多少着色器,再由程序员来决定是否有很多.他们可以将他们需要的所有功能合并到一个巨大的着色器(超级着色器)中,并使用布尔值uniforms(通常被认为是一种不好的做法)来打开和关闭这些功能,或者让每个着色器做一些事情并按照正确的方式绑定正确的他们需要什么.
这一行到底是做什么的:
glBindFragDataLocation(shaderProgram, 0, "outColor");
这意味着out在片段着色器执行结束时存储在声明变量"outColor"中的任何内容都将作为最终主片段颜色发送到GPU.
最重要的是这一切如何适合大型项目?究竟是什么用于VAO-s?大多数教程只是为了绘制一个立方体或2个带有硬编码顶点的东西,那么如何管理具有大量对象的场景呢?我已经阅读了这个帖子并且对场景管理的发生方式有了一些了解,但我仍然无法弄清楚如何将OpenGL的东西连接到它.
他们共同努力在屏幕上绘制漂亮的彩色形状.VBOs是存储场景顶点的结构(全部以丑陋的方式对齐),VertexAttribPointer调用告诉GPU如何VBO排列数据,VAOs提前存储所有这些VertexAttribPointer指令并一次性发送所有指令在主循环中渲染过程中简单地绑定一个,并在屏幕上绘制场景的过程中为着色器提供更多控制.
所有这一切听起来都是压倒性的,但通过练习,你会习惯它.
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |