跳转到内容

GLSL 编程/Blender/最小着色器

来自 Wikibooks,开放世界开放书籍
Blender 2.5 用户界面的屏幕截图。大窗口是带有打开的工具架3D 视图。它上面是一个小的信息窗口。在右下角是属性窗口。每个窗口的类型可以通过其左下角或左上角的图标更改。

本教程涵盖了在 Blender 2.6 中创建最小 GLSL 着色器的基本步骤。

创建 GLSL 着色器

[编辑 | 编辑源代码]

例如,指定和运行 GLSL 顶点和片段着色器的步骤如下

  • 首先,启动 Blender
    • 在 Windows 下,像启动其他应用程序一样启动 Blender。然后单击信息窗口(默认情况下是最顶行):窗口 > 切换系统控制台,以便查看错误消息。
    • 在 GNU/Linux 下,从控制台或终端启动它,这样你就可以看到错误消息。例如,单击应用程序 > 附件 > 终端,然后键入blender并按回车键。
    • 在 MacOS X 下,通过右键单击应用程序包并选择显示包内容来启动 Blender。然后转到内容 > MacOS,并在那里启动 blender 可执行文件,以便查看错误消息。
  • 文本编辑器中(单击任何 Blender 窗口的左下角或左上角的图标以更改其类型),选择文本 > 创建文本块,复制下面的 Python 脚本,并为其命名。
  • 信息窗口中,单击添加 > 网格 > 立方体(或其他网格,或使用默认立方体)。
  • 3D 视图中,通过右键单击选择网格。
  • 对于某些网格,使用平滑着色是有意义的:在3D 视图中从菜单中选择视图 > 工具架(或按t),然后单击对象工具 > 着色 > 平滑
  • 对于某些 GLSL 着色器,必须将视口着色设置为纹理:在3D 视图中,在菜单右侧的第二个小部件中选择纹理
  • 对于某些 GLSL 着色器,必须激活GLSL 着色:在3D 视图中,从菜单中选择视图 > 属性(或按n),然后选择显示 > 着色 > GLSL
  • 逻辑编辑器中(网格仍然处于选中状态),单击添加传感器 > 始终,并为其命名。
  • 逻辑编辑器中,单击添加控制器 > Python,为其命名,并将脚本设置为您在文本编辑器中选择的 Python 脚本的名称。
  • 逻辑编辑器中,通过将连接从传感器右侧的小圆盘拖放到控制器左侧的小圆盘来将传感器连接到控制器。
  • 3D 视图中,按p(代表“播放”)启动游戏引擎,查看着色器的效果,它应该以全红色渲染物体。
    或者,您也可以转到信息窗口,选择“Blender 游戏”(而不是“Blender 渲染”)作为引擎;然后转到属性窗口,选择渲染选项卡(相机图标),然后单击嵌入式播放器下的开始按钮。
  • 如果 GLSL 程序未编译或链接,则错误消息将打印到控制台。
  • Esc停止游戏引擎。
  • 为您的第一个 GLSL 着色器感到高兴!

以下是 Python 脚本

import bge

cont = bge.logic.getCurrentController()

VertexShader = """
   void main() // all vertex shaders define a main() function
   {
      gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
         // this line transforms the predefined attribute gl_Vertex 
         // of type vec4 with the predefined uniform 
         // gl_ModelViewProjectionMatrix of type mat4 and stores 
         // the result in the predefined output variable gl_Position 
         // of type vec4. (gl_ModelViewProjectionMatrix combines 
         // the viewing transformation, modeling transformation and 
         // projection transformation in one matrix.)
   }
"""

FragmentShader = """
   void main()
   {   
      gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
         // this fragment shader just sets the output color to opaque
         // red (red = 1.0, green = 0.0, blue = 0.0, alpha = 1.0)
   }
"""

mesh = cont.owner.meshes[0]
for mat in mesh.materials:
    shader = mat.getShader()
    if shader != None:
        if not shader.isValid():
            shader.setSource(VertexShader, FragmentShader, True)

(如果您知道更简单的方法来为单个对象设置着色器,请随时编辑此页面。)

编辑着色器

[编辑 | 编辑源代码]

现在是尝试使用着色器的最佳时机;特别是,您可以轻松地更改计算出的片段颜色。通过在文本编辑器中打开 Python 脚本并将片段着色器替换为此代码来尝试霓虹绿色

   // this fragment shader should be assigned 
   // to "FragmentShader" in the script above

   void main()
   {   
      gl_FragColor = vec4(0.6, 1.0, 0.0, 1.0); 
         // red, green, blue, alpha
   }

您必须再次启动游戏引擎才能应用新的着色器;见上文。颜色现在应该为绿色。您也可以尝试修改红色、绿色和蓝色分量,以找到最温暖的橙色或最暗的蓝色。(实际上,有一部关于寻找最温暖的橙色的电影,以及一部关于接近黑色的暗蓝色的另一部。)

您也可以尝试使用顶点着色器,例如尝试此顶点着色器

   // this vertex shader should be assigned 
   // to "VertexShader" in the script above

   void main() 
   {
      gl_Position = gl_ModelViewProjectionMatrix * 
         (vec4(1.0, 0.1, 1.0, 1.0) * gl_Vertex);
   }

这通过将坐标乘以来使任何输入几何体变平。(这是一个按分量进行的向量乘积;有关 GLSL 中向量和矩阵的更多信息,请参阅“向量和矩阵运算”中的讨论。)

如果着色器未编译,Blender 会在控制台中显示错误消息,如上所述

Blender Game Engine Started
---- Vertex Shader Error ----
0:4(83): error: syntax error, unexpected ')', expecting ',' or ';'

---- Vertex shader failed to compile ----
Blender Game Engine Finished


在场景中保存您的作品

[编辑 | 编辑源代码]

还有一件事:您应该将作品保存在 Blender 文件中(扩展名为.blend)。从信息窗口菜单中选择文件 > 另存为...。(请记住,您可以使用窗口左上角或左下角的图标更改任何 Blender 窗口的类型)。

关于术语的另一个说明

[编辑 | 编辑源代码]

澄清一下术语可能会有所帮助。在 GLSL 中,“着色器”是指顶点着色器或片段着色器。两者的组合称为“程序”。

不幸的是,Blender 将这种程序称为“着色器”,而顶点着色器称为“顶点程序”,片段着色器称为“片段程序”。

为了使混乱更加完美,我将使用“着色器”一词来指代 GLSL 程序,即顶点和片段着色器的组合。但是,我将使用 GLSL 术语“顶点着色器”和“片段着色器”,而不是“顶点程序”和“片段程序”。

恭喜您完成了本教程。您所看到的一些内容是

  • 如何在 Blender 中创建指定 GLSL 着色器的 Python 脚本。
  • 如何为特定对象激活该 Python 脚本。
  • 如何在片段着色器中操作输出颜色gl_FragColor
  • 如何在顶点着色器中转换输入属性gl_Vertex

实际上,这已经涵盖了不少内容。

进一步阅读

[编辑 | 编辑源代码]

如果您还想了解更多


< GLSL 编程/Blender

除非另有说明,此页面上的所有示例源代码均为公有领域。
华夏公益教科书