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 SimulatorParticleSimulator用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.老朋友點擊點擊右上角「……」標誌分享到朋友圈