From 87055352c3591c9bab639c1072bae8baa58871a5 Mon Sep 17 00:00:00 2001 From: Meow J Date: Wed, 15 Jul 2015 15:25:31 +0800 Subject: [PATCH] Formatting --- 01 Getting started/05 Shaders.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/01 Getting started/05 Shaders.md b/01 Getting started/05 Shaders.md index 8c508f6..e37bd96 100644 --- a/01 Getting started/05 Shaders.md +++ b/01 Getting started/05 Shaders.md @@ -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函数看似平常,但是能够显示这个自造类如何让我们的生活变轻松(虽然只有一点)。