CSharpGL(0)一個易學易用的C#版OpenGL

2021-02-13 dotNET跨平臺

CSharpGL是我受到SharpGL的啟發,在整理了SharpGL,GLM,SharpFont等開源庫的基礎上,做的一個新的C#版OpenGL庫,希望它能做到易學易用,簡化OpenGL開發,減少低級錯誤,幫助初學者更快地由入門到精通。

CSharpGL已在GitHub開源,歡迎對OpenGL有興趣的同學加入(https://github.com/bitzhuwei/CSharpGL)

CSharpGL有什麼?

下面是目前CSharpGL的一部分示例。你可以:

繪製模型

你可以用legacy opengl(glVertex)或modern opengl(VBO+Shader)繪製模型。當然這是最基本的功能。CSharpGL提供一個GLCanvas控制項供你進行繪製。

使用紋理(貼圖)

你可以用legacy opengl(glVertex)或modern opengl(VBO+Shader)為模型貼上貼圖。例如下面是用一個含有ASCII碼的貼圖貼在一個Quad上實現的。(此例還含有Blend相關的操作)

用Shader實現光照效果

CSharpGL集成了一些《OpenGL Programming Guide》的Demo。例如在GLSL中實現光照效果。

用Shader製作Fur效果

下圖所示的模型數據中只有藍色的人物,外層的白色毛毛是geometry shader根據模型頂點信息製作出來的。這也是從redbook轉換到C#的Demo之一。

Particle Simulator

ParticleSimulator用Compute Shader和glMapBufferRange實現了一個簡單的例子效果。這也是從redbook轉換到C#的Demo之一。

Instanced Rendering

這個Demo演示了用DrawArraysInstanced實現Instanced Rendering的方法。這也是從redbook轉換到C#的Demo之一。

繪製文字

CSharpGL提供一個PointSpriteStringElement類型實現繪製所有Unicode範圍內文字的功能。你可以加載任何TTF/TTC文件中的字形來繪製文字。如果加載的TTF文件含有中文字形,就可以用來顯示中文字符。如果含有任何其他語言文字的字形,都是可以顯示的。

CSharpGL提供一個副產品:TTF2Bmps,可以從TTF/TTC字體文件中提取所有的字形,保存為PNG圖片。這演示了CSharpGL內部是如何獲取字形貼圖的。

PointSprite示例

CSharpGL提供了多個使用PointSprite進行繪製的Demo。CSharpGL還提供了很多其他OpenGL功能的用法的示例代碼。你可以在CSharpGL.Winforms.Demo項目中找到所有的Demo。

對VBO內的圖元的拾取

CSharpGL提供IColorCodedPicking接口用以實現拾取功能。你可以在下面的Demo程序中了解如何使用IColorCodedPicking及其輔助類型。

繪製UI控制項

在上面的示例中你看到有的窗口左下角有一個坐標系,這就是一種UI元素。下面是另一個UI元素(色標)。UI元素可以指定其大小、是否綁定到上下左右邊框等屬性。只需實現IUILayout接口即可自動實現UI布局。你可以從示例代碼中看到這一布局機制是如何實現的。這一布局機制對legacy OpenGL和modern OpenGL的效果相同。

其它

CSharpGL還提供了很多其他的Demo,如對基礎類型UnmanagedArray的使用、Debugging的使用、MapBuffer、Feedback、Instanced Rendering、3D紋理等。我會繼續添加新的功能和Demo。你既可以通過CSharpGL來學習OpenGL,也可以用CSharpGL來編寫OpenGL程序。

CSharpGL為了降低出錯可能,為OpenGL各項功能提供了針對性的枚舉類型、重載方法和易於理解的對象。例如等BufferTarget、BufferUsage、GetTarget、PolygonMode、PrimitiveMode、ShadeModel等枚舉類型,Camera、ShaderProgram、SceneElementBase、RenderContext、Texture2D等通用的類型,IColorCodedPicking、IUILayout、IMVP、IRenderable等包含著各自的功能機制的接口。

CSharpGL將為每項功能、機制編寫文檔,講解其原理和實現,並提供Demo。為了讓我能在未來多少年後都能順利地重拾OpenGL,我一定會盡心地把文檔做好。

CSharpGL還拿來了GLM、SharpFont等開源項目,用於計算矩陣、獲取字形貼圖等操作。

+BIT祝威+悄悄在此留下版了個權的信說:

回到頂部(go to top)

CSharpGL與其他C#OpenGL類庫的對比SharpGL

創建OpenGL Render Context的過程只支持Windows平臺。

提供OpenGLControl控制項供執行OpenGL指令。

提供SceneControl和一系列接口,用於繪製一個樹狀組織的場景。但樹狀組織的場景是基於legacy OpenGL的棧結構(glPushMatrix()、glPopMatrix())設計的,對modern OpenGL並不恰當(但仍可用)。

提供了一些Studio之類的工具,但幾乎不能使用。

提供了VSIX插件,可一鍵創建SharpGL項目。這很適合初學者研究OpenGL入門。

提供數十個Demo項目,分別演示了OpenGL的某些功能(貼圖、拾取、光照……)的實現方法。

在渲染文字、拾取等高級內容方面沒有針對modern OpenGL的方案。

到今天(2015年8月30日)已有半年多不更新。針對modern OpenGL的內容比較少。

文檔基本上沒有,不過也不需要太多文檔,直接追蹤代碼就可以了解了。

OpenTK

跨平臺。為實現跨平臺,大量使用了設計模式,代碼複雜度飆升,不利於學習掌握。

針對OpenGL、OpenGL ES的各個版本分別編寫底層接口,代碼量飆升,不利於學習理解。

同時含有OpenCL、OpenAL,功能可謂豐富。

部分功能尚未實現,只列出了代碼框架。

由於代碼量超大,內存佔用稍多,速度稍慢。(待驗證)

文檔還是有一些的。

Tao.Framework

幾年前Tao.Framework已被OpenTK取代,我就不再關注了。

CSharpGL

創建OpenGL Render Context的過程只支持Windows平臺。

提供GLCanvas控制項供執行OpenGL指令。

面向modern OpenGL,兼顧legacy OpenGL,為場景元素提供最簡設計。並用接口及其輔助機制實現矩陣變換、拾取、UI布局等功能。

提供數十個Demo,分別演示了OpenGL的某些功能(Shader、貼圖、拾取、光照、文字、UI……)的實現方法。

將部分《OpenGL Programming Guide(8th Edition)》中的代碼轉換為C#版。

提供TTF2Bmps,可讀取TTF/TTC字體文件後輸出含有字形的PNG圖片及其位置信息(XML)。

CSharpGL剛剛問世,文檔將針對各個功能點逐步添加。

總評

在跨平臺方面,只有OpenTK能做到。跨平臺到底有多大的價值,我不敢妄言。但對於水平有限的本人來說,能夠簡化一切不必要的複雜性,把OpenGL本身學好是第一位的,所以在學習階段能否跨平臺並不重要。

在功能方面,OpenTK也是最豐富的,但學習起來比較費力。SharpGL學起來比較輕鬆,但其功能在支持modern OpenGL方面比較少。很多很實用的功能又沒有很好的實現,導致難以使用。

在性能方面,OpenTK與SharpGL調用底層的OpenGL函數的機制是相同的,所以兩者應該沒有大的區別。但OpenTK本身的代碼量很大,所以可能稍微慢一點點,不過在目前的硬體配置能夠承受的情況下,這都不成問題。(若要追求最高速度,直接用C/C++才行。用C#主要是為了提升開發和調試效率,少折騰)

在OpenGL接口方面,OpenTK也是很全面的,SharpGL對modern OpenGL的支持則很少。

CSharpGL的目標是易學易用。為此,CSharpGL除了調用OpenGL指令、執行矩陣變換、創建Render Context等最基礎的功能外,都做成了可選的Demo項目。一方面Demo代碼可用作學習參考,另一方面可以去掉Demo項目,只用最基礎的類庫進行開發。CSharpGL的Demo涵蓋了OpenGL的各項功能,並對繪製文字、UI、拾取等高級功能也設計了可復用的機制,且全部面向modern OpenGL。

總之,OpenTK是強大而稍複雜,SharpGL是簡約而稍老舊,CSharpGL則結合使用簡便、功能豐富兩方面,用「一個Demo演示一項功能」的方式學用OpenGL。

計劃

我計劃針對所有實現了的功能、機制逐個寫一篇隨筆。本篇算是開篇。

總結

學OpenGL有2年了,從NEHE到SharpGL,從《3D Math Primer for Graphics and Game Development》到《OpenGL Programming Guide》,算是對OpenGL有了初級的認識。最近我糾集整理了SharpGL,GLM,SharpFont等開源庫,想做一個更好用的純C#版OpenGL。歡迎對OpenGL有興趣的同學加入(https://github.com/bitzhuwei/CSharpGL)

原文地址:http://www.cnblogs.com/bitzhuwei/p/CSharpGL-an-easy-to-learn-and-easy-to-use-OpenGL-library-in-csharp.html

關注我們的方法:
1.點擊文章標題下的「dotNET跨平臺」藍字,或者在微信搜索「opendotnet」,加關注
2.老朋友點擊點擊右上角「……」標誌分享到朋友圈

相關焦點

  • opengl實踐-從零開發遊戲
    作者:愛幹球的RDlearnopengl是一套很棒的opengl教程,深入淺出、有源碼且免費,除了說良心,不知道還能用什麼詞彙來形容這種高水平且善良的公益行為
  • OpenGL glfw學習(一)初識,環境,窗口
    要有GLFW庫源碼包,要有編譯此源碼的Cmake工具,還要有GLAD,GLAD是一個用來訪問OpenGL規範接口的第三方庫,讓我們調用OpenGL函數時只需要用熟悉的函數調用方式,不需要創建一個函數指針、加載dll中的函數地址如此繁瑣的調用。
  • 易語言 4.0 Beta 2
    易語言是一個自主開發,適合國情,不同層次不同專業的人員易學易用的漢語程式語言。
  • 易教易學下載_易教易學手機版下載_易教易學安卓版免費下載-太平洋...
    易教易學 學習辦公 大小: 10.89M
  • OpenGL 與 Go 教程(一)Hello, OpenGL
    我敢保證,你今天看到的圖形有些就是用 OpenGL 渲染的。可是,不管 OpenGL 多受歡迎、有多好用,與學習其它高級繪圖庫相比,學習 OpenGL 是要相當足夠的決心的。這個教程的目的是給你一個切入點,讓你對 OpenGL 有個基本的了解,然後教你怎麼用 Go[6]操作它。幾乎每種程式語言都有綁定 OpenGL 的庫,Go 也不例外,它有 go-gl[7] 這個包。
  • LibreOffice 3.5.0 Beta2:修正多處錯誤
    LibreOffice是OpenOffice.org 辦公套件衍生版, 同樣免費開源,但相比OpenOffice增加了很多特色功能。LibreOffice擁有強大的數據導入和導出功能,能直接導入PDF文檔、微軟Works、LotusWord,支持主要的OpenXML格式。
  • 原創 | 學好opengl走遍天下都不怕系列《基礎篇》
    前言最近本來是想認真學習下《opengl es第三版》這本書,無奈內容過於生澀,有點看不下去,偶遇opengl-tutorial.org
  • beng ~ 你的C4D彈出了一個錯誤窗口
    用WinRAR 5.5版本解壓安裝包(注意是解壓出來,而不是在解壓軟體窗口直接雙擊運行C4D安裝程序)或者用虛擬光碟機打開C4D安裝包。二. 安裝中錯誤用WinRAR 5.5版本或者用虛擬光碟機打開C4D安裝包。 2.重命名或者更換安裝包在沒有中文路徑的地方。三. 安裝後打不開C4D解決方法:1. 安裝目錄有中文。重命名去掉中文,或者重新安裝C4D到一個沒有中文的目錄
  • 宸裕說易第三講——易學的溯本求源
    到漢朝之後,《易經》成為儒家五經之首,田何傳易於王同、周王孫、丁寬、服生,丁寬傳易於同郡的田王孫,田王孫再傳易給孟喜、施仇、梁邱賀,孟喜再傳焦延壽,焦延壽再傳京房,至此,著名的孟京易學形成。簡單的做了一個思維導圖,比較直觀。後面還有諸多的傳承徑脈,此不贅述。
  • Friso-1.6.0 發布 - C語言高性能中文分詞器,GBK支持
    Friso是使用c語言開發的u一款開源中文分詞器,使用流行的mmseg算法實現。
  • 中天易學的難與易:即中天易學的太極思維推論
    中天易學的難與易:即中天易學的太極思維理論導師:張永紅指導 徒弟:姚士普整理昨天,有位易友給我發來紅包,讓我幫他看一下八字,斷一下關口,我說不會,不給他看,他說我知道你參加中天易的學習了,肯定會,
  • C+相比其他語言到底難在哪裡?
    看過程式語言排行榜的都知道,c/c++自02年以來,不管時代如何發展,其排名一直在前五以內,足見其在程式語言界的地位。編程界流行這麼一句話:c幾乎什麼都能做,c++幾乎什麼都能做好,足見其功能的強大。
  • W10數字許可激活C#版v3.0 Windows10永久激活工具
    W10數字許可激活C#版 是一款由吾愛破解論壇angelkyo參考國外工具編寫的Windows 10數字權利激活工具,這款Win10數字權利獲取工具
  • 中文語音識別技術在c#中的應用(二)
    正在閱讀:中文語音識別技術在c#中的應用(二)中文語音識別技術在c#中的應用(二)2004-06-11 10:04出處:CSDN作者:tashanzhishi>  接上篇《中文語音識別技術在c#中的應用(一)》………但是,這個方法本身並不知道你給的字符串是什麼語言,所以需要我們它這個字符串用什麼語言讀出。
  • SoildWorks 2018SP5.0破解版安裝教程
    SoildWorks 2018SP5.0破解版連結:
  • OpenGl著色器簡單範例
    新手,把書上的代碼弄來弄去,結果還是沒有動,就搜了好久,終於弄到一個定點著色器和片源著色器能運行的了.搜到的blog:http://blog.csdn.net/qianqiang1989/article/details/8307219首先會使用vs2013英語版創建C++的ConsoleApplication並且會增加相關的文件.cpp或者.h (特別說明,添加完也可以通過對增加的文件
  • 易學常識——「漢易」與「周易」有什麼不同?
    其實用現代語言講,非常簡單——實際上就是中華哲學!換句話說,「易」是古代中華文化背景下,是與西方、現代文化背景下的哲學功能相等同的學術系統!然而,如今人們但凡談到《易經》,多數以為《易經》就等同於《周易》,這是非常遺憾的,落入了極大的誤區。事實上,對後代易學的各類應用形式影響最大的恰恰反而是《漢易》,而非《周易》;並且,這一認識上的誤區障蔽了易學傳統文化的真實價值。
  • C語言程序開發中常用的assert,到底有什麼用,有哪些好處?
    相信不少初學者在閱讀一些開源的C語言項目時,都會看到 assert 關鍵字,那麼它有什麼用呢,又有哪些好處呢?/a.outa.out: t.c:7: main: Assertion `interest_rate>=0' failed.Aborted顯然,當 interest_rate 為負數時,assert(interest_rate>=0); 將提前(以異常方式)終止程序運行,並給出錯誤的原因。
  • 尹世明:百度雲已經成為更易學、易用、易推廣的智能開發平臺
    尹世明:百度雲已經成為更易學、易用、易推廣的智能開發平臺金羊網  作者:  2018-12-07 人工智慧將推動全社會新一輪產業變革,「雲」巔之上的企業正向著智能化、AI化升級。
  • 文本連接的5個超級技巧解讀,簡單易學、易懂易用!
    目的:將「省」、「市」、「區」、「詳細地址」合併到一個單元格中。方法:在目標單元格中輸入公式:=CONCAT(C3,D3,E3,F3)。解讀:1、用Councat函數連接字符串時,無法添加分隔符,其功能和「&」的功能一樣。2、此函數只能在16及以上版本中使用。四、Concatenate函數法。