mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 04:35:28 +08:00
Formatting
This commit is contained in:
@@ -82,7 +82,7 @@ vec4 otherResult = vec4(result.xyz, 1.0f);
|
||||
|
||||
!!! Important
|
||||
|
||||
也可以移除layout (location = 0),通过在OpenGL代码中使用glGetAttribLocation请求属性地址(location),但是我更喜欢在着色器中设置它们,理解容易而且节省时间。
|
||||
也可以移除layout (location = 0),通过在OpenGL代码中使用glGetAttribLocation请求属性地址(location),但是我更喜欢在着色器中设置它们,理解容易而且节省时间。
|
||||
|
||||
另一个例外是像素着色器需要一个vec4颜色输出变量,因为像素着色器需要生成一个最终输出的颜色。如果你在像素着色器没有定义输出颜色,OpenGL会把你的物体渲染为黑色(或白色)。
|
||||
|
||||
@@ -141,9 +141,9 @@ void main()
|
||||
|
||||
我们在像素着色器中声明了一个uniform vec4 ourColor,并把像素着色器的输出颜色设置为uniform值。因为uniform是全局变量,我们我们可以在任何着色器中定义它们,而无需通过顶点着色器作为中介。顶点着色器中不需要这个uniform所以不用在那里定义它。
|
||||
|
||||
!!!Atention
|
||||
!!! Atention
|
||||
|
||||
如果你声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量,从而最后编译出的版本中并不会包含它,如果有一个从没用过的uniform出现在已编译版本中会出现几个错误;记住这点!
|
||||
如果你声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量,从而最后编译出的版本中并不会包含它,如果有一个从没用过的uniform出现在已编译版本中会出现几个错误;记住这点!
|
||||
|
||||
uniform现在还是空的;我们没有给它添加任何数据,所以下面就做这件事。我们首先需要找到着色器中uniform的索引/地址。当我们得到uniform的索引/地址后,我们就可以更新它的值了。这里我们不去给像素传递一个颜色,而是随着时间让它改变颜色:
|
||||
|
||||
@@ -159,16 +159,16 @@ glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
|
||||
|
||||
接着,我们用glGetUniformLocation请求uniform ourColor的地址。我们为请求函数提供着色器程序和uniform的名字(这是我们希望获得的地址的来源)。如果glGetUniformLocation返回-1就代表没有找到这个地址。最后,我们可以通过glUniform4f函数设置uniform值。注意,查询uniform地址不需要在之前使用着色器程序(use shader program),但是更新一个unform之前必须不许使用程序(调用glUseProgram),因为它是在当前激活的着色器程序中设置unform的。
|
||||
|
||||
!!!Important
|
||||
!!! Important
|
||||
|
||||
因为OpenGL是C库内核,所以它不支持函数重载,在函数参数不同的时候就要定义新的函数;glUniform是一个典型例子。这个函数有一个特定的作为类型的后缀。有几种可用的后缀:
|
||||
|
||||
* f:函数需要以一个float作为它的值。
|
||||
* i:函数需要一个int作为它的值。
|
||||
* ui:函数需要一个unsigned int作为它的值。
|
||||
* 3f:函数需要3个float作为它的值。
|
||||
* fv:函数需要一个float向量/数组作为它的值。
|
||||
* 每当你打算配置一个OpenGL的选项简单地这样选择适合你的数据类型的重载的函数。在我们的例子里,我们使用uniform的4float版,所以我们通过glUniform4f传递我们的数据(注意,我们也可以使用fv版本)。
|
||||
因为OpenGL是C库内核,所以它不支持函数重载,在函数参数不同的时候就要定义新的函数;glUniform是一个典型例子。这个函数有一个特定的作为类型的后缀。有几种可用的后缀:
|
||||
|
||||
* f:函数需要以一个float作为它的值。
|
||||
* i:函数需要一个int作为它的值。
|
||||
* ui:函数需要一个unsigned int作为它的值。
|
||||
* 3f:函数需要3个float作为它的值。
|
||||
* fv:函数需要一个float向量/数组作为它的值。
|
||||
* 每当你打算配置一个OpenGL的选项简单地这样选择适合你的数据类型的重载的函数。在我们的例子里,我们使用uniform的4float版,所以我们通过glUniform4f传递我们的数据(注意,我们也可以使用fv版本)。
|
||||
|
||||
现在你知道如何设置uniform变量的值了,我们可以使用它们来渲染了。如果我们打算让颜色慢慢变化,我们就要在游戏循环的每一帧更新这个uniform,否则三角形就不会改变颜色。下面我们就计算greenValue然后每个渲染迭代都更新这个uniform:
|
||||
|
||||
@@ -306,9 +306,9 @@ public:
|
||||
#endif
|
||||
```
|
||||
|
||||
!!!Important
|
||||
!!! Important
|
||||
|
||||
在上面,我们用了几个预处理指令。这些预处理指令告知你的编译器,只在没被包含过的情况下才包含和编译这个头文件,即使多个文件都包含了这个shader头文件。它是用来防止链接冲突的。
|
||||
在上面,我们用了几个预处理指令。这些预处理指令告知你的编译器,只在没被包含过的情况下才包含和编译这个头文件,即使多个文件都包含了这个shader头文件。它是用来防止链接冲突的。
|
||||
|
||||
shader类保留了shader程序的ID。它的构造器需要顶点和像素着色器源代码的文件路径,我们可以把各自的文本文件储存在硬盘上。Use函数看似平常,但是能够显示这个自造类如何让我们的生活变轻松(虽然只有一点)。
|
||||
|
||||
|
Reference in New Issue
Block a user