OPENGL裝置座標系(dns)是左手座標系,螢幕座標系原點在左下角向上向右增加
4.顏色值格式不同
D3D9 最常用的頂點顏色格式是BGRA格式(也就是D3DCOLOR),而OpenGL預設用的是RGBA格式。D3D9用BGRA純粹是因為歷史原因,早期硬 件不支援UBYTE4的格式,只能用D3DCOLOR,然後再shader裡呼叫D3DCOLORtoUBYTE4。現在的GPU都支援 UBYTE4,D3D10+也是可以直接使用RGBA,所以這已經不是問題了。
如果需要相容已經生成BGRA格式資料,現代OpenGL提供了GL_EXT_vertex_array_bgra這個擴充套件,也可以使用BGRA作為頂點顏色輸入格式:
glColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, stride, pointer);
glSecondaryColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, stride, pointer);
glVertexAttribPointer(GL_BGRA, GL_UNSIGNED_BYTE, stride, pointer);
該擴充套件進入了OpenGL 3.2的核心。
5.D3D11的一些高階特性還只是軟體層面的,而且OPENGL也可以實現
State物件
D3D 10新增了State物件,可以極大地減少由於改變渲染狀態所需的系統呼叫次數。OpenGL中目前還沒有State物件,所以只能在上層自行封裝。雖然 有些 效能損失,但介面可以和D3D統一起來。ARB針對OpenGL的State物件進行過曠日持久的討論,還最終各大廠商沒有達成一致。不過這是個趨勢,相 信不久的將來就會出個相關的擴充套件。到時候這個區別就能被完美地填平。
Compute ShaderD3D 11引入了compute shader,在D3D中直接提供了GPGPU的能力。OpenGL沒有因此增加一種shader,而是增強和同門師弟OpenCL的互操作能力。 OpenGL和OpenCL能直接共享texture和buffer等,起到了和compute shader等價的功能。與GLSL和HLSL的關係一樣,這裡存在著shader語言不同的問題,而且沒有Cg可以作為橋樑,目前只能寫兩份程式碼。
D3D 11的multithreading能力允許多個context都呼叫D3D11 API,每個context儲存下來的API呼叫流可以在主context執行依次執行。OpenGL目前也沒有引入該機制,需要在上層自行實現。話說回 來了,目前的所有顯示卡 驅動都沒有實現multithreading,所以所有多context都是由D3D runtime軟體實現的,沒有達到應有的提速效果。自己實現一個command list也能達到那樣的效能。仍然希望某一天multithreading能成為OpenGL的功能 之一,簡化上層的工作。
總結所以說,OpenGL和D3D功能的交集幾乎就是它們的並集,並不會因為需要相容兩者而失去很多功能。從功能上說,OpenGL和D3D之間的分歧甚至小於OpenGL和OpenGL ES。破解了第一篇說的流言4。
6.Shader部分,cg可以編譯大部分著色器程式碼為GLSL和HLSL.