GLSL 程式設計/Blender/最小著色器

本教程涵蓋了在 Blender 2.6 中建立最小 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。
實際上,這已經涵蓋了不少內容。
如果您還想了解更多
- 關於頂點和片段著色器的一般資訊,您可以閱讀 “OpenGL ES 2.0 管道” 的描述。
- 關於如何在 GLSL 中處理向量(例如
vec4型別)和矩陣,您可以閱讀 “向量和矩陣操作”。 - 關於頂點變換,例如
gl_ModelViewProjectionMatrix,您可以閱讀 “頂點變換”。 - 關於如何應用頂點變換,例如
gl_ModelViewProjectionMatrix,您可以閱讀 “應用矩陣變換”。 - 關於 Blender 的 Python API 如何指定著色器,您可以閱讀 Blender 文件中關於
bge.types.BL_Shader類的內容。