使用 .NET 8.0 和 OpenGL 創建一個簡易的渲染器

来源:https://www.cnblogs.com/xymfblogs/p/18021497
-Advertisement-
Play Games

前言我個人對三維渲染領域的開發有著濃厚的興趣,儘管並未在相關行業工作過,我的瞭解還很片面。去年,在與群友聊天時,他們推薦了一本《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)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在之前的文章中,我們簡單的介紹了線程誕生的意義和基本概念,採用多線程的編程方式,能充分利用 CPU 資源,顯著的提升程式的執行效率。其中java.lang.Thread是 Java 實現多線程編程最核心的類,學習Thread類中的方法,是學習多線程的第一步。 ...
  • 今天我們主要講解的是Spring依賴註入。在本文中,我們主要圍繞bean填充屬性的欄位和setter方法展開討論。要記住的是,在進行屬性註入時,我們首先需要找到註入點併進行緩存,然後才會真正進行屬性註入。需要註意的是,靜態欄位或方法是不會進行依賴註入的。最後,我們簡單地介紹了一下關鍵源碼,以及對@R... ...
  • 通過`FromStr`及`Display`的重定義,我們可以支持更強大的自定義的序列化操作,系統綁定埠既認埠號也認綁定IP,所以我們可以對同個埠進行多次綁定。 ...
  • python打包和反編譯 從py到exe 打包 安裝Pyinstaller pip install pyinstaller //太慢可切源 pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源 pip install -i h ...
  • API介面是一種讓不同系統之間實現數據交互的工具,它可以實現不同系統之間的數據共用和數據傳遞。全國今日油價API介面是一項非常有用的介面,它可以提供最新的全國各省汽油和柴油價格信息。本文將為大家介紹全國今日油價API介面的使用方法,並提供相應代碼說明。 介面名稱:全國今日油價API介面介面地址:ht ...
  • 當我們在編寫代碼時,經常會遇到需要管理資源的情況,比如打開和關閉文件,如果遇到了一些異常情況,我們需要關閉資源,不然會導致資源泄露,雖然我們可以通過手動的方式來關閉,但如果有多個異常情況需要考慮的話,萬一不小心漏了一處,就芭比Q了。所以,如果有一種更加優雅的方式來處理資源泄露的問題,那必定是非常ni ...
  • 拓展閱讀 sensitive-word-admin v1.3.0 發佈 如何支持分散式部署? sensitive-word-admin 敏感詞控台 v1.2.0 版本開源 sensitive-word 基於 DFA 演算法實現的高性能敏感詞工具介紹 更多技術交流 業務背景 如果我們的敏感詞部署之後,不 ...
  • Java 方法 簡介 方法是一塊僅在調用時運行的代碼。您可以將數據(稱為參數)傳遞到方法中。方法用於執行特定的操作,它們也被稱為函數。 使用方法的原因 重用代碼:定義一次代碼,多次使用。 提高代碼的結構化和可讀性。 將代碼分解成更小的模塊,易於維護和理解。 創建方法 方法必須在類內聲明。它的定義包括 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...