OpenGL 3.3+ - 着色器,属性,制服,输入/输出变量 - 如何,什么,何时,为什么?

时间:2017-05-09 17:29:12

标签: c# opengl graphics rendering game-engine

我目前正在学习OpenGL 3.3+以及基于着色器的现代渲染过程。到目前为止,我已经能够使用C#为GLFW和OpenGL创建自己的绑定,并且我对现在的一切都有了相当好的理解。我喜欢从零开始做所有事情,因为我喜欢知道项目中的所有内容是如何工作的。

但是一些不想“坚持”的东西是:输入/输出变量,属性和制服之间究竟有什么区别。我怎么知道使用哪一个?我想我已经对OpenGL状态机如何工作有了相当好的理解,但这部分渲染过程很少详细解释。大多数教程或书籍只是说“这就是你如何将数据传递给着色器”,但我还没有找到一个文本来解释使用哪种方法,最重要的是:为什么。

另外,我想了解更多关于着色器和VBO之间连接的信息。我想这可以与上面的问题结合起来。

使问题更具体的另一个编辑:是否有来源详细解释变化,属性,制服和缓冲对象之间的关系?他们是如何工作的?哪一个使用的时候?应该避免什么?

1 个答案:

答案 0 :(得分:3)

着色器变量之间的差异如下:

属性是每个顶点数据片段。这些变量的目的是为顶点的位置提供附加数据。特定于每个顶点的纹理坐标,法线和颜色是属性的良好示例。在最常见的情况下,您可以通过创建顶点缓冲区对象并将此数据附加到着色器中的属性来为着色器提供属性。

Uniforms包含在单个渲染调用期间不会更改的值。这就是为什么矩阵常常被看作是一个统一的值,因为网格的变换对于它的所有顶点都是相同的。

Varyings用于在着色器之间传递信息。这些值仅存在于GPU上。变化值在整个多边形上插值。您只提供3个顶点的值,但片段将包含基于3个顶点值的插值。

将顶点缓冲区连接到着色器是通过绑定顶点缓冲区并提供有关顶点缓冲区的属性指针的信息来完成的。

我建议最新版本的“红皮书”,这是一个非常全面的OpenGL学习资源。它也会坚持OpenGL核心配置文件的确切版本。兼容模式是一个噩梦,因为允许使用所有遗留函数,并且网上有许多教程混合了不同OpenGL版本的功能。不要这样做......你会后悔的。 获取此精确版本的参考卡(例如https://www.khronos.org/files/opengl4-quick-reference-card.pdf),重点关注一个版本的功能。