在哪个着色器中执行计算有什么区别吗
Does it make any difference which shader calculations are performed in?
使用GLSL,我将执行照明计算、纹理和各种操作;但是它在哪个着色器中完成有什么区别吗例如,在顶点着色器而不是片段着色器中执行照明计算是否有性能优势?我只需要将最终结果传递给片段着色器,并将其添加到片段颜色中。反之亦然吗?
我的下一个问题是,关于顶点属性和统一:
顶点属性对于任何着色器程序中的所有着色器都是全局的吗例如,假设我们有:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertices), (GLvoid*)0);
如果我在顶点着色器中声明:
layout (location = 0) in vec3 VertexPosition;
我也可以在片段着色器中执行同样的操作吗?我也可以在与第二个着色器程序相关的顶点着色器中执行同样的操作吗
关于制服,我是否可以在该着色器程序的所有着色器中使用制服,只要我声明它们
uniform mat4 modelMatrix; // In the vertex shader
uniform mat4 modelMatrix; // In the fragment shader
我的最后一个问题是,所有顶点属性在整个主程序中都应该一致吗如中所示,如果我将顶点属性0分配为"顶点位置",那么我就不能再将该属性分配给其他对象,如"顶点法线",对吗?只有当我用禁用顶点属性数组时,才会发生这种情况
glDisableVertexAttribArray(0);
我会进行照明计算,纹理和各种各样的;但是它在哪个着色器中完成有什么区别吗?
想想OpenGL管道中的数据流
大多数基本体由1个(点)、2个(线)或3个(三角形)顶点组成,但可能会生成数千个片段。因此,由于顶点着色器的运行频率要低得多,因此每个顶点可以计算的任何东西都比每个片段便宜。
通常,您尽量不计算每个顶点的整个照明方程(gourud),因为除非使用过多的顶点,否则它看起来很糟糕。但是,可以在顶点着色器中将所有照明向量变换到相同的坐标空间中,以简化片段着色器并提高性能。
顶点属性对于任何着色器程序中的所有着色器都是全局的吗?
顶点属性被指定给常规位置,并且这些位置是全局的。但是片段着色器是按每个片段操作的,并且没有顶点的概念(再次回想数据流)。
我是否可以在该着色器程序的所有着色器中使用统一,只要我声明它们?
另一方面,统一格式在所有着色器阶段之间共享。只要名称和类型一致,就可以从顶点、几何体、镶嵌或片段着色器中使用它们。
所有顶点属性是否应该在整个主程序中保持一致?
这真的没关系,可编程管道是可编程的。只要您知道执行着色器时N表示的顶点属性,就可以继续。但是,如果建立了标准约定,则可以在不更改顶点属性指针的情况下动态交换着色器程序。
在固定函数管道的时代,有一种标准化的约定,其中顶点位置别名为0,颜色别名为3、法线别名为2等等。但这纯粹是历史性的,如果你想或创建自己的,你可以遵循这个惯例。
- 编译器对数组声明大小的计算。什么时候发生?
- 计算 I+V[i++] 的顺序是什么?
- 在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?
- "noexcept-expression 由于对......的调用而计算为'假'"是什么意思?
- 在 C++20 计算范围内相邻对的最简洁明了的方法是什么?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 什么是使用 opencv::Mat 优化 c++ 矩阵计算
- 当删除或删除[]被执行时,计算机会做什么?
- 对于我扩展此程序来计算最高10x10矩阵的倒数的最简单方法是什么
- MFC 用于计算控件的高光、阴影等的算法或函数是什么?
- 什么是计算C中PI的最有效方法
- 如何计算余数有什么区别吗?
- 此递归中发生了什么?我需要仅使用递归/无循环来计算和备份
- 谁可以帮助解释我的代码中出了什么问题.计算C ++中的数组
- 计算文本文件中行数的最佳条件是什么
- 计算每对向量的重复项的有效方法是什么?
- 我的逻辑有什么问题?尝试计算文件中包含特定字符的单词数
- 此表达式计算什么