前言我個人對三維渲染領域的開發有著濃厚的興趣,儘管並未在相關行業工作過,我的瞭解還很片面。去年,在與群友聊天時,他們推薦了一本《Unity Shader入門精要》,說適合像我這樣想自學的新人,於是我打開了通往新世界的大門。這本書涵蓋了很多基礎的渲染知識,如光照、陰影、各種風格的渲染等等。對於有興趣的 ...
前言
我個人對三維渲染領域的開發有著濃厚的興趣,儘管並未在相關行業工作過,我的瞭解還很片面。去年,在與群友聊天時,他們推薦了一本《Unity Shader入門精要》,說適合像我這樣想自學的新人,於是我打開了通往新世界的大門。這本書涵蓋了很多基礎的渲染知識,如光照、陰影、各種風格的渲染等等。對於有興趣的同學,可以在京東讀書中線上閱讀,無需購買紙質版。 在學習過程中,我發現使用Unity Shader編寫著色器非常方便,它很好地封裝了渲染概念中的Pipeline、Pass等要點。因此,我萌生了一個想法:是否可以模仿Unity Shader來開發一款屬於自己的渲染器呢?
必備的技術點 (不分先後)
- 線性代數 - 在編寫Shader時,瞭解線性代數是至關重要的,因為許多內置函數與線性代數相關,幫助你理解代碼含義。
- 圖形學基礎 - 瞭解圖形學基礎也是必要的,即使只對圖形庫的作用和渲染流程有基本瞭解。
- 圖形庫API - 掌握圖形庫API是開發渲染器的核心,可以根據個人偏好選擇適合自己的API,如OpenGL、Vulkan、DirectX等。
- 編程基礎 - 編程基礎也是必備技能。
這些知識結合起來,可以幫助你更好地開發自己的渲染器。
項目搭建和所需依賴
- Silk.NET.OpenGL - OpenGL 的 C# 包裝器。
- Silk.NET.Shaderc、Silk.NET.Shaderc.Native - 用於以 SPIR-V 方式編譯 GLSL。註意,OpenGL 4.6 支持 SPV Shader。
- Silk.NET.Windowing、Silk.NET.Input - 對 glfw、sdl 視窗進行包裝,包含控制器輸入(滑鼠、鍵盤等)。
- StbImageSharp - 用於解析圖片。
- Silk.NET.Assimp - 用於解析三維模型。
- Silk.NET.Maths - 一個完善的數學庫。
- Hexa.NET.ImGui、Hexa.NET.ImGuizmo - ImGui 的 C# 包裝器。
項目架構
- TrContext.cs - 統一管理使用的 GL 和 GL 擴展的上下文。
- TrShader.cs - 用於載入 Shader,支持 SPV 二進位文件和 Shader 字元串。
- TrRenderPipeline.cs - 管理一條管線中的 Shader,並維護管線狀態,如混合狀態、重採樣、深度測試、模板測試等。
- TrRenderPass.cs - 管理多條管線和切換管線。
- TrTexture.cs - 管理紋理和採樣器屬性。
- TrFrame.cs - 創建並維護一個 Frame,支持多重採樣。
- TrScene.cs - 內置一個 Frame 的 ImGui 視窗,用於綁定渲染。
- TrBuffer.cs - 使用 OpenGL 創建並維護記憶體,可設置記憶體優先順序。
- TrTransform.cs - 簡易的矩陣變換類,支持平移、縮放、旋轉。
- TrCamera.cs - 相機類。
- TrMesh.cs - 管理網格體的頂點數據和索引數據。
- TrMaterial.cs - 渲染器的核心,管理著渲染管線和材質屬性,負責進行網格的渲染。
項目中,所有材質和 Shader 按照書中的章節進行了分組管理。
項目預覽
- 初始界面
- 窗體菜單
-
場景模型拾取和 Transform
-
漫反射場景
- 各類紋理渲染
- Shadertoy 網站的 shader 渲染,我抄了幾個 Shadertoy BETA
項目地址
qian-o/Triangle: OpenGL 實戰項目。 (github.com)