1
0
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:
Meow J
2015-07-15 15:25:31 +08:00
parent 39bb3f1c81
commit 87055352c3

View File

@@ -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函数看似平常但是能够显示这个自造类如何让我们的生活变轻松虽然只有一点