• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            OpenGL顯卡編程

            OpenGL顯卡編程

             
            文檔簡述:
              隨著顯卡的飛速發展,更快的速度以及越來越多的新功能為硬件所支持,硬件的進步使得圖形程序開發人員可以創造出更加絢麗的視覺效果,現在,電影級動畫的實時渲染已不再是夢想。我們怎么在OpenGL中利用顯卡的新特性呢?答案就是OpenGL擴展。
              注:如不作特別說明,本站文章中的顯卡均指面向普通用戶的非專業顯卡。

            文檔目錄:
              OpenGL擴展
              顯卡差異
              頂點/片斷編程
              Cg/RenderMonkey/及其他

            文檔內容:
             

            OpenGL 擴展 OpenGL Extensions

              OpenGLDirect3D比較起來,最大的一個長處就是其擴展機制。硬件廠商開發出一個新功能,可以針對新功能開發OpenGL擴展,軟件開發人員通過這個擴展就可以使用新的硬件功能。所以雖然顯卡的發展速度比OpenGL版本更新速度快得多,但程序員仍然可以通過OpenGL使用最新的硬件功能。而Direct3D則沒有擴展機制,硬件的新功能要等到微軟發布新版DirectX后才可能支持。

              OpenGL擴展也不是沒有缺點,正因為各個硬件廠商都可以開發自己的擴展,所以擴展的數目比較大,而且有點混亂,有些擴展實現的相同的功能,可因為是不同廠商開發的,接口卻不一樣,所以程序中為了實現這個功能,往往要為不同的顯卡寫不同的程序。這個問題在OpenGL 2.0出來后可能會得到解決,OpenGL 2.0的一個目標就是統一擴展,減少擴展數目。

            擴展名


            ??? 每個擴展都有一個擴展名,擴展名類似如下形式:

            ?????????????????????? GL_ARB_multitexture

            第一段GL,用來表示針對OpenGL哪部分開發的擴展,有以下幾個值:

            • GL? 針對OpenGL核心的擴展

            • WGL 針對Windows平臺的擴展

            • GLX 針對Unix / Linux平臺的擴展

            • GLU 針對OpenGL Utility Library的擴展

            第二段ARB,用來表示是誰開發的這個擴展,常見以下幾個值:

            • ARB OpenGL Architecture Review BoardOpenGL管理機構)正式核準的擴展,往往由廠商開發的擴展發展而來,如果同時存在廠商開發的擴展和ARB擴展,應該優先使用ARB擴展?

            • EXT 被多個硬件廠商支持的擴展

            • NV? – nVIDIA 公司開發的擴展

            • ATI – ATI公司開發的擴展

            • ATIX – ATI公司開發的實驗性擴展

            • SGI – Silicon GraphicsSGI)公司開發的擴展

            • SGIX – Silicon GraphicsSGI)公司開發的實驗性擴展

            第三段multitexture就是真正的擴展名了,如multitexture就是多重紋理擴展。

            ?

            使用OpenGL擴展

              要使用一個OpenGL擴展,首先必須檢查顯卡是否支持這個擴展,以下代碼可以獲取一個顯卡支持的的OpenGL擴展:
            ??? const char *str = glGetString( GL_EXTENSIONS );
              
            函數返回一個字符串指針,這個字符串就是顯卡所支持的所有擴展的擴展名,不同的擴展名之間用空格隔開,形如:

            ??? "GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters …… "

            ????

              OpenGL擴展往往都會新增一些函數,在Windows平臺上,這些函數不是通過.lib庫連接到程序里的,而要在運行時動態獲得函數的指針。我們以GL_ARB_point_parameters擴展為例看看怎么獲得函數指針。

            ??

            首先要定義函數指針類型,

            ??? typedef void (APIENTRY * PFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param);
            ??? typedef void (APIENTRY * PFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat *params);

            這個工作SGI已經為我們做好,它提供了一個頭文件 glext.h,里面有目前絕大多數擴展的常量和函數指針定義,下載下來放到編譯器的include/GL文件夾下面,然后在程序里面加上:

            ???

            #include <GL/glext.h>

            就可以在程序中使用常量和函數指針類型了。

            ??

            然后要定義函數指針:

            ???

            PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
            ??? PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;

            ??
            再檢查顯卡是否支持
            GL_ARB_point_parameters 擴展,其中 isExtensionSupported 是自定義的一個函數,就是在glGetString( GL_EXTENSIONS )返回的字符串里查找是否存在指定的擴展名:

            ???

            int hasPointParams = isExtensionSupported("GL_ARB_point_parameters");
             

            如果支持,就可以用 wglGetProcAddress 函數獲取擴展函數的指針:

            ??? if (hasPointParams)?

            ??? {
            ??????? glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)\ wglGetProcAddress( "glPointParameterfEXT" );
            ??????? glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) \ wglGetProcAddress( "glPointParameterfvEXT" );
            ??? }

            ??
            最后就可以在程序里使用擴展函數:

            ??? if (hasPointParams)

            ??? {
            ??????? static GLfloat quadratic[3] = { 0.25, 0.0, 1/60.0 };
            ??????? glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, quadratic);
            ??????? glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
            ??? }

             

            WGL擴展

              glGetString( GL_EXTENSIONS )取得的擴展字符串中并不包括針對Windows平臺的WGL擴展,WGL擴展串要通過WGL_ARB_extensions_string擴展來獲得,以下代碼演示了如何獲得WGL擴展串:

            ???

            定義WGL_ARB_extensions_string擴展新增函數wglGetExtensionsStringARB的函數指針類型,同樣這個工作SGI已經為我們做好,只不過不在glext.h中,而在它提供的另外一個頭文件 wglext.h 中:

            ???

            typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)( HDC hdc);

             

            定義函數指針:

            ??? PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;

             

            檢查是否支持WGL_ARB_extensions_string擴展,如果不支持,表示這個顯卡不支持WGL擴展,如果支持,則得到wglGetExtensionsStringARB函數的指針,并調用它得到WGL擴展串:

            ??? int hasWGLext = isExtensionSupported("WGL_ARB_extensions_string");

            ??? if (hasWGLext)

            ??? {

            ??????? wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) \ wglGetProcAddress( "wglGetExtensionsStringARB" );

            ??????? const char *wglExt = wglGetExtensionsStringARB( hdc );

            ??????? ……

            ??? }

            ???

            OpenGL版本

              一些常用的OpenGL擴展會在新版的OpenGL中加到OpenGL核心中去,成為OpenGL標準的一部分,可以簡化程序開發,程序員使用這些功能時不必做繁瑣的擴展初始化工作。比如多重紋理功能,在OpenGL1.2.1加入到OpenGL核心中,以前要使用多重紋理,要先檢查是否支持GL_ARB_multitexture擴展,然后初始化glActiveTextureARB等函數,很麻煩,而OpenGL1.2后,則可以直接使用glActiveTexture函數。

              不過,這種簡化只有Mac/Unix/Linux程序員才能享受到,在Windows平臺上沒有這么簡單。微軟為了維護Direct3D,對OpenGL的支持很消極,其OpenGL實現仍然是1.1。由于Windows上的OpenGL程序最終都會動態鏈接到微軟的OpenGL32.dll,可OpenGL32.dll只支持OpenGL 1.1,使我們不能直接使用新版OpenGL,仍然要用擴展訪問OpenGL1.1以來新增的功能。

             ??

            OpenGL擴展資料

            ? All About OpenGL Extensions
            ????? 討論OpenGL擴展機制,講述了如何閱讀擴展官方說明書,并舉了一些擴展的例子。必讀。

            ? OpenGL Extension Registry
            ????? 由SGI維護,列出了目前公開的所有擴展及其官方說明書。

            ? OpenGL Hardware Registry
            ????? 由Delphi3D.net維護,列出了目前幾乎所有3D加速卡的OpenGL硬件信息,包括其支持的擴展。當然,這里面列的擴展不能作為程序的依據,程序中要使用某個擴展,還是要先檢查顯卡是否支持。因為同樣的顯卡,如果驅動程序不同,支持的擴展也不相同,往往新的驅動程序會加入新的擴展,丟掉一些廢棄的擴展。

            ??
            OpenGL硬件加速

              在Windows平臺上,OpenGL驅動可能有三種模式:純軟件、MCD和ICD:

            • 純軟件模式:微軟提供一個OpenGL的軟件實現,所有渲染操作均由CPU完成,速度很慢。如果安裝系統時使用Windows自帶的顯卡驅動程序,那么OpenGL程序就會運行在軟件模式下。而且由于微軟有自己的Direct3D,所以對OpenGL的支持很消極,它的OpenGL純軟件實現只支持OpenGL1.1,而目前OpenGL的最新版本為1.4

            • MCD(Mini Client Driver):MCD是早期微軟在Windows NT上支持OpenGL時,為了簡化驅動開發時使用的一個模型。在這個模型中,OpenGL渲染管線的變換、光照部分仍然由軟件實現,而光柵化部分則由硬件廠商實現,因此只要硬件支持,MCD可以硬件加速光柵化部分。MCD雖然可以簡化驅動開發,但是功能限制太大,現在市面上的3D加速卡均支持硬件變換和光照,MCD卻不能利用這一特性,看上去MCD已經沒有存在的價值

            • ICD(Installable Client Driver):ICD是一個完整的OpenGL驅動模型,比MCD復雜得多。硬件廠商要實現完整的OpenGL渲染管線,如變換、光照、光柵化等,因此只要硬件支持,ICD可以硬件加速整個OpenGL渲染管線。我們通常說的OpenGL硬件加速就是指的通過ICD模型獲得的硬件加速,而現在硬件廠商提供的OpenGL驅動程序也都是依照ICD模型開發的。主要硬件廠商的ICD已經可以支持OpenGL的最新版1.4

            ??

              Windows怎么實現OpenGL硬件加速呢?OpenGL32.dll是微軟的OpenGL?1.1純軟件實現,我們的程序都要動態鏈接到這個dll。如果安裝3D芯片廠商的驅動程序,會將一個不同名字的dll放到Windows系統目錄下,比如在Windows?2000下安裝nVIDIA?GeForce2?MX的驅動程序,會在系統目錄下放一個nvoglnt.dll(這就是nVIDIA的OpenGL驅動),并在注冊表中登記nvoglnt.dll,讓Windows知道硬件加速OpenGL驅動的名字,以后運行OpenGL程序,OpenGL32.dll就會把OpenGL調用直接轉到nvoglnt.dll。

            ??

            ??? Windows平臺上,一個OpenGL程序是否使用硬件加速由三個因素決定,這三個因素缺一不可,否則程序都會運行于純軟件模式:

            • 是否有一塊3D加速卡

            • 是否安裝了顯卡廠商提供的最新的驅動程序,Windows自帶的顯卡驅動程序并不會提供OpenGL硬件加速能力

            • 指定的像素格式是否被顯卡硬件所支持

            ??? 判斷一種像素格式是否被顯卡硬件所支持,可以用函數 DescribePixelFormat 取得該像素格式的數據,然后看結構體 PIXELFORMATDESCRIPTOR 中的 dwFlags 的值,如果

            • PFD_GENERIC_FORMAT 被置1,并且 PFD_GENERIC_ACCELERATED 被置0,即
              (pfd.dwFlags & PFD_GENERIC_FORMAT) &&?
              !(pfd.dwFlags & PFD_GENERIC_ACCELERATED)

              表明該像素格式不被顯卡硬件支持,使用該像素格式的OpenGL程序將使用純軟件模式渲染

            • PFD_GENERIC_FORMAT 被置1,并且 PFD_GENERIC_ACCELERATED 被置1,即
              (pfd.dwFlags & PFD_GENERIC_FORMAT) &&?
              (pfd.dwFlags & PFD_GENERIC_ACCELERATED)

              表明該像素格式被顯卡硬件支持,并且程序使用MCD模式渲染

            • PFD_GENERIC_FORMAT 被置0,并且 PFD_GENERIC_ACCELERATED 被置0
              !(pfd.dwFlags & PFD_GENERIC_FORMAT) &&?
              !(pfd.dwFlags & PFD_GENERIC_ACCELERATED)

              表明該像素格式被顯卡硬件支持,并且程序使用ICD模式渲染



             

            顯卡差異

              正如前面所說,不同的顯卡廠商可能會為相同的功能開發不同的OpenGL擴展,使得OpenGL擴展的編程復雜化,就算實現相同的功能也可能需要為不同的顯卡開發不同的程序。好在現在顯卡芯片市場只有nVIDIA和ATI兩家當道,所以工作量也不會太大。而OpenGL 2.0推出后,這種情況會大為改觀。

              游戲的運行環境差異很大,可能運行于只具備基本3D加速能力的老顯卡上,也可能運行于最新推出的功能強大的3D加速卡上,而且顯卡芯片的廠商也各不相同。對于顯卡較差的機器,要保證游戲能運行,而對于較好的顯卡,要充分發揮它的功能,創造絢麗的圖形效果。這就是說游戲需要多條執行路徑,運行時根據顯卡配置選擇不同的執行路徑。怎么決定需要多少種執行路徑呢?

             

              設計執行路徑要考慮兩個主要因素:

            • 決定要重點支持的顯卡芯片廠商

              現在3D顯卡芯片市場有兩個主要廠商nVIDIA和ATI,它們各自的OpenGL擴展也最多,必須為它們設計相應的執行路徑。對于其他廠商,因為幾乎所有廠商都會盡量支持ARB擴展,可以設計執行路徑,使用各個廠商都支持的ARB擴展。

            • 程序支持的顯卡檔次

              顯卡芯片都會有個芯片代號,類似于軟件的版本號。相同主版本號的芯片屬于一個檔次,支持的功能往往一樣。設計圖形程序時,可以根據芯片代號來決定需要設計多少種執行路徑。要注意的是必須要設計一條和顯卡無關的,只使用OpenGL基本功能的執行路徑,使得程序能夠在低端顯卡上運行。

              現在可能使用的nVIDIA和ATI的顯卡芯片代號和顯卡型號的對應關系如下表:

             

            ?nVIDIA

             

            ?ATI

            ?芯片代號 顯卡型號   ?芯片代號 顯卡型號
            ?NV1
            ?NV2
            ?NV3
            ?NV4?
            ?NV5?
            NV1
            Riva 128
            Riva 128ZX
            Riva TnT
            Riva TnT2
              ?RAGE(?) RAGE PRO
            RAGE 128
            RAGE 128 PRO
            ?NV10?
            ?NV11?

            ?NV15?
            ?NV17?
            ?NV18?
            GeForce 256
            GeForce2 MX *

            GeForce2 *
            GeForce4 MX *
            GeForce4 MX AGP8X *
              ?R100?


            ?RV200
            RADEON 7000
            RADEON
            RADEON 7200
            RADEON 7500
            ?NV20?


            ?NV25?
            ?NV28?
            Geforce3 Ti200 GeForce3
            GeForce3 Ti500
            GeForce4 Ti *

            GeForce4 Ti AGP 8X *
              ?RV250?
            ?R200?

            ?RV280?
            RADEON 9000
            RADEON 8500
            RADEON 9100
            RADEON 9200 AGP 8X
            ?NV34?
            ?NV31?
            ?NV30?
            ?NV35?
            GeForce FX 5200
            GeForce FX 5600
            GeForce FX 5800
            GeForce FX 5900
              ?RV300?
            ?RV350?
            ?R300?
            ?R350?
            RADEON 9500
            RADEON 9600
            RADEON 9700
            RADEON 9800

            ·其中標注 * 的是產品系列,型號還會細分

            ·通常大家習慣用芯片代號的主版本號來統稱一代芯片,例如用NV20統稱NV20/NV25/NV28,用R200統稱RV250/R200/RV280

            ·雖然ATI RADEON 7500的芯片型號是RV200,但實際屬于R100檔次的產品
            ??

              我們來看一個執行路徑的例子,idSoftware即將推出的Doom3的執行路徑。

            Doom3一共有6條執行路徑:

            1. ARB:幾乎不使用擴展,沒有鏡面高光效果,沒有頂點編程(vertex program),保證程序能在低端顯卡上運行

            2. NV10:支持所有功能,每幀需要渲染5個pass(five rendering passes,指一個對象多次送入渲染管道,比如第一次渲染漫射光diffuse,第二次渲染鏡面高光specular ……,各次渲染結果通過glBlend混合在一起形成最終效果),沒有頂點編程

            3. NV20:支持所有功能,2或3個pass

            4. NV30:支持所有功能,1個pass

            5. R200:支持所有功能,大部分情況下只需1個pass

            6. ARB2:支持所有功能,浮點片斷編程(fragment program),1個pass

              nVIDIA顯卡可能執行ARB / NV10 / NV20 / NV30 / ARB2 五條路徑,其中NV10 / NV20 / NV30 專門針對不同檔次的nVIDIA顯卡開發的。

              ATI顯卡可能執行 ARB / R200 / ARB2 三條路徑,其中R200是專門針對ATI開發的。

              而其他顯卡則根據檔次高低執行ARB或ARB2路徑。ARB用于低端顯卡,ARB2用于高端顯卡。



             

            頂點/片斷編程

              1999年底,nVIDIA推出GeForce 256,并開始使用GPU(Graphics Processing Unit)來稱呼顯卡芯片(也有廠商叫VPU(Visual Processing Unit),是一回事)。GeForce 256最大賣點是硬件T&L(Transform&Lighting,變換和光照),這意味著變換和光照計算可以在GPU中進行,大大減輕了CPU的壓力,顯卡開始成為獨立于CPU的一個處理器。

              硬件T&L后,GPU最激動人心的進步就是引入了可編程能力。我們知道,OpenGL和Direct3D都有固定的渲染管線,定義光源,送入頂點位置、法線、紋理坐標等,就可以給你渲染出一幅圖像來,程序員對具體的渲染過程無法控制。而OpenGL擴展和DirectX8給渲染管線引入可編程能力,圖形軟件開發人員可以編寫運行于顯卡芯片的匯編程序來控制具體的渲染過程,這給予圖形軟件開發更大的靈活性,并且由于硬件的支持,獲得這些靈活性并不會犧牲性能。GPU的可編程能力對實時圖形渲染會產生深遠的影響。
            ?

              OpenGL支持兩種可編程模型:

            • 頂點編程Vertex Program,對應于Direct3D中的Vertex Shader,提供可編程的T&L能力,代替了傳統渲染流水線中的T&L,處理頂點的變換、光照計算

            • 片斷編程Fragment Program,對應于Direct3D的Pixel Shader,提供可編程的光柵化操作,代替了傳統流水線中的紋理映射、逐像素顏色及霧效處理

              目前頂點編程相關的擴展有

            • GL_NV_vertex_program :nVIDIA NV10檔次顯卡用軟件模擬,NV20及以上檔次顯卡上硬件支持

            • GL_NV_vertex_program1_1 :nVIDIA NV10檔次顯卡用軟件模擬,NV20及以上檔次顯卡上硬件支持

            • GL_EXT_vertex_shader :在ATI R200及以上檔次顯卡上支持

            • GL_ARB_vertex_program :由上面三個擴展發展而來,支持上面三個擴展的顯卡安裝最新的驅動程序后都會支持此擴展,所以程序中不必支持上面三個擴展,只支持此擴展就可以了。此擴展不支持分支循環

            • GL_NV_vertex_program2 :在nVIDIA NV30及以上檔次顯卡上支持,支持分支循環,估計會成為GL_ARB_vertex_program2擴展的原型

            • 實際上ATI R300級別的顯卡已經在頂點編程中支持分支循環(硬件支持DirectX9的vs2.0),但并沒有開發擴展提供給OpenGL程序員使用,估計是在等支持分支循環的GL_ARB_vertex_program2擴展出臺

              可見現在使用OpenGL的vertex program,只需支持GL_ARB_vertex_program和GL_NV_vertex_program2兩個擴展。

            ?

              目前片斷編程相關的擴展有

            以上擴展提供的功能不是編寫運行于GPU的匯編碼,而是通過函數調用的方式實現,不如編寫匯編碼直觀方便。下面幾個擴展則可以通過編寫匯編碼來實現片斷編程

              與頂點編程相比,片斷編程要復雜得多:

            • 在NV10系列上,只能使用GL_NV_register_combiners提供的部分片斷編程能力

            • 在NV20系列上,則可以使用register combiners和texture shader實現片斷編程

            • 在NV30系列上,可以使用GL_ARB_fragment_program和GL_NV_fragment_program

            • 在ATI R200系列上,使用GL_ATI_fragment_shader

            • 在ATI R300系列上,使用GL_ARB_fragment_program

              看到這里我們不難理解為什么Doom3會將渲染執行路徑分成ARB、NV10、NV20、NV30、R200、ARB2幾條了:

            • ARB既沒有頂點編程也沒有片斷編程

            • NV10沒有用到頂點編程(雖然NV10支持頂點編程,但是是軟件模擬,而顯卡硬件并不支持),但用到register combiners實現凹凸貼圖(Bump Mapping)

            • NV20使用頂點編程,并用register combiners和texture shader實現片斷編程

            • NV30使用頂點編程,并用GL_NV_fragment_program實現片斷編程

            • R200使用頂點編程,并用GL_ATI_fragment_shader實現片斷編程

            • ARB2使用頂點編程,并用GL_ARB_fragment_program實現片斷編程

            ???

              附表:

              nVIDIA顯卡頂點、片斷編程支持情況

            芯片代號 紋理單元數 Register Combiner Texture Shader Vertex Program Fragment Program
            ?NVX 2 X X X X
            ?NV10 2 2 X NVvp1.1/ARBvp1.0 RC
            ?NV20 4 8 支持 NVvp1.1/ARBvp1.0 RC/TS
            ?NV30 4 8 支持 NVvp2.0/ARBvp1.0 ARBfp1.0/NVfp

            ?

              ATI顯卡頂點、片斷編程支持情況

            芯片代號 紋理單元數 Vertex Program Fragment Program
            ?RAGE 2 X X
            ?R100 3 X X
            ?R200 6 EXTvp/ARBvp1.0 ATIfp
            ?R300 8 EXTvp/ARBvp1.0 ARBfp1.0

             



            Cg(C for Graphics)

              直接使用擴展編寫vertex program和fragment program不太方便,要么是函數調用,要么是匯編碼,相當于用x86匯編編寫PC程序,而現在已經有了面向vertex program和fragment program的高級語言,稱為HLSL(高級著色語言,High Level Shading Language)。

              Cg是nVIDIA提出的一種高級著色語言,它的語法和C語言類似,可以大大簡化vertex program和fragment program的編寫。用它寫的程序可以:

            • 編譯成GL_NV_vertex_program / GL_NV_vertex_program1_1 / GL_ARB_vertex_program / GL_NV_vertex_program2 的匯編碼

            • 編譯成GL_ARB_fragment_program / GL_NV_fragment_program的匯編碼

            • 編譯成用于nvParse的RC(Register Combiners)及TS(Texture Shader)腳本

            • 直接在程序中調用Cg提供的API,運行Cg程序

            • 編譯成DirectX的 vertex shader / pixel shader

              我們可以看到Cg只是對nVIDIA的產品支持比較好,而其他廠商的產品只有支持GL_ARB_vertex_program/GL_ARB_fragment_program時才能從Cg獲得好處,不支持這兩個ARB擴展的顯卡則不能運行Cg編寫的程序,大大降低了Cg的實用性。雖然Cg提供接口,使其他廠商可以對Cg進行擴展,以支持各個廠商自己的OpenGL擴展,不過Cg畢竟是一個企業的產品,別的廠商不會支持,所以如果要寫通用的圖形程序,Cg并不合適。

              況且OpenGL的HLSL——GLslang(OpenGL Shading Language)規范已經被ARB審核通過,估計不久就可以使用GLslang編寫vertex program和fragment program,到時Cg的位置應該會相當尷尬,因為OpenGL和DirectX都已經有了自己的HLSL。不過話說回來,Cg可以同時支持OpenGL和DirectX,這也算是它的一個優勢。

            ?

               RenderMonkey

              RenderMonkey并不是一種語言,而是ATI推出的一個編寫調試vertex program和fragment program的集成開發環境,目前只支持DirectX的vertex shader / pixel shader / HLSL,不過ATI正在和3Dlabs合作,不日RenderMonkey也會支持OpenGL vertex program / fragment program / GLslang。另外,RenderMonkey不僅僅是為程序員設計的,美工也可以使用。

             

               nvParse

              nvParse是nVIDIA公司推出的一個庫,可以簡化RC(Register Combiners)及TS(Texture Shader)的開發。使用GL_NV_register_combiners和GL_NV_texture_shader擴展實現片斷編程全是函數調用的形式,很不方便,而nVIDIA為了簡化RC和TS程序開發,建立了一種腳本格式,用簡單的腳本代替復雜的GL_NV_register_combiners和GL_NV_texture_shader函數調用,nvParse則提供API用于解釋執行RC和TS腳本。

            ??

            模擬NV30

              并非所有程序員都有一塊NV30顯卡,但nVIDIA最新的雷管驅動程序(version 40.41及以后)支持軟件模擬NV30架構,只不過很慢,但對沒有NV30顯卡的程序員已經是個福音了,只要我們有一塊GeForce級的顯卡,安裝最新的雷管驅動程序,然后下載一個NVEmulate.exe (52 KB),運行它,打開NV30模擬,你的顯卡就支持NV30的所有功能了,這樣就算沒有NV30顯卡同樣可以針對NV30開發程序。要注意的是,不需要NV30模擬的時候要記得關掉它,畢竟是軟件模擬,速度很慢。

            ??

            后記

              寫這些只是希望為后來的朋友指一個方向,寫得很簡略,因為我自己也在學習,hoho,更多的東西還是需要大家自己多看多寫 :) 我將來也會慢慢放上一些詳細的文章以及源碼,希望能對大家有所幫助。關于這篇文章的問題或建議,可以寫信給我,我的聯系方式

            posted on 2006-10-15 20:47 zmj 閱讀(3070) 評論(0)  編輯 收藏 引用

            国产成人无码精品久久久久免费| 久久97久久97精品免视看秋霞| 久久精品国产99久久丝袜| 久久久久久久亚洲精品| 久久一区二区免费播放| 久久精品99久久香蕉国产色戒| 久久久精品人妻无码专区不卡| 天天做夜夜做久久做狠狠| 久久99国产精品二区不卡| 一本久道久久综合狠狠爱| 亚洲国产日韩欧美久久| 狠狠人妻久久久久久综合| 伊人久久亚洲综合影院| 99精品久久精品一区二区| 久久天堂AV综合合色蜜桃网| 精品久久久久久中文字幕大豆网| 午夜精品久久久久| 久久久久久亚洲精品影院| 国产精品久久久久…| 亚洲国产成人精品无码久久久久久综合| 久久精品国产亚洲av麻豆蜜芽 | 99久久做夜夜爱天天做精品| 国内精品久久久久久不卡影院| 久久久久亚洲AV无码专区首JN | 久久www免费人成精品香蕉| 亚洲香蕉网久久综合影视| 欧美国产成人久久精品| 香港aa三级久久三级| 久久er国产精品免费观看8| 69久久夜色精品国产69 | 久久99精品久久久久久动态图| 色欲综合久久躁天天躁蜜桃| 浪潮AV色综合久久天堂| 久久久精品久久久久影院| 久久中文精品无码中文字幕| 99久久精品这里只有精品| www亚洲欲色成人久久精品| 欧美亚洲另类久久综合| 精品伊人久久久| 免费无码国产欧美久久18| 精品伊人久久久|