• <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顯卡編程

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

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

            文檔內(nèi)容:
             

            OpenGL 擴展 OpenGL Extensions

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

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

            擴展名


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

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

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

            • GL? 針對OpenGL核心的擴展

            • WGL 針對Windows平臺的擴展

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

            • GLU 針對OpenGL Utility Library的擴展

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

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

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

            • NV? – nVIDIA 公司開發(fā)的擴展

            • ATI – ATI公司開發(fā)的擴展

            • ATIX – ATI公司開發(fā)的實驗性擴展

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

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

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

            ?

            使用OpenGL擴展

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

            ??? "GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters …… "

            ????

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

            ??

            首先要定義函數(shù)指針類型,

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

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

            ???

            #include <GL/glext.h>

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

            ??

            然后要定義函數(shù)指針:

            ???

            PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
            ??? PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;

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

            ???

            int hasPointParams = isExtensionSupported("GL_ARB_point_parameters");
             

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

            ??? if (hasPointParams)?

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

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

            ??? 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擴展新增函數(shù)wglGetExtensionsStringARB的函數(shù)指針類型,同樣這個工作SGI已經(jīng)為我們做好,只不過不在glext.h中,而在它提供的另外一個頭文件 wglext.h 中:

            ???

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

             

            定義函數(shù)指針:

            ??? PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;

             

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

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

            ??? if (hasWGLext)

            ??? {

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

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

            ??????? ……

            ??? }

            ???

            OpenGL版本

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

              不過,這種簡化只有Mac/Unix/Linux程序員才能享受到,在Windows平臺上沒有這么簡單。微軟為了維護Direct3D,對OpenGL的支持很消極,其OpenGL實現(xiàn)仍然是1.1。由于Windows上的OpenGL程序最終都會動態(tài)鏈接到微軟的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硬件信息,包括其支持的擴展。當然,這里面列的擴展不能作為程序的依據(jù),程序中要使用某個擴展,還是要先檢查顯卡是否支持。因為同樣的顯卡,如果驅(qū)動程序不同,支持的擴展也不相同,往往新的驅(qū)動程序會加入新的擴展,丟掉一些廢棄的擴展。

            ??
            OpenGL硬件加速

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

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

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

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

            ??

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

            ??

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

            • 是否有一塊3D加速卡

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

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

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

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

              表明該像素格式不被顯卡硬件支持,使用該像素格式的OpenGL程序?qū)⑹褂眉冘浖J戒秩?

            • 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模式渲染



             

            顯卡差異

              正如前面所說,不同的顯卡廠商可能會為相同的功能開發(fā)不同的OpenGL擴展,使得OpenGL擴展的編程復雜化,就算實現(xiàn)相同的功能也可能需要為不同的顯卡開發(fā)不同的程序。好在現(xiàn)在顯卡芯片市場只有nVIDIA和ATI兩家當?shù)溃怨ぷ髁恳膊粫蟆6鳲penGL 2.0推出后,這種情況會大為改觀。

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

             

              設計執(zhí)行路徑要考慮兩個主要因素:

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

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

            • 程序支持的顯卡檔次

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

              現(xiàn)在可能使用的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

            ·其中標注 * 的是產(chǎn)品系列,型號還會細分

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

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

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

            Doom3一共有6條執(zhí)行路徑:

            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顯卡可能執(zhí)行ARB / NV10 / NV20 / NV30 / ARB2 五條路徑,其中NV10 / NV20 / NV30 專門針對不同檔次的nVIDIA顯卡開發(fā)的。

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

              而其他顯卡則根據(jù)檔次高低執(zhí)行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給渲染管線引入可編程能力,圖形軟件開發(fā)人員可以編寫運行于顯卡芯片的匯編程序來控制具體的渲染過程,這給予圖形軟件開發(fā)更大的靈活性,并且由于硬件的支持,獲得這些靈活性并不會犧牲性能。GPU的可編程能力對實時圖形渲染會產(chǎn)生深遠的影響。
            ?

              OpenGL支持兩種可編程模型:

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

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

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

            • 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 :由上面三個擴展發(fā)展而來,支持上面三個擴展的顯卡安裝最新的驅(qū)動程序后都會支持此擴展,所以程序中不必支持上面三個擴展,只支持此擴展就可以了。此擴展不支持分支循環(huán)

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

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

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

            ?

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

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

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

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

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

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

            • 在ATI R200系列上,使用GL_ATI_fragment_shader

            • 在ATI R300系列上,使用GL_ARB_fragment_program

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

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

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

            • NV20使用頂點編程,并用register combiners和texture shader實現(xiàn)片斷編程

            • NV30使用頂點編程,并用GL_NV_fragment_program實現(xiàn)片斷編程

            • R200使用頂點編程,并用GL_ATI_fragment_shader實現(xiàn)片斷編程

            • ARB2使用頂點編程,并用GL_ARB_fragment_program實現(xiàn)片斷編程

            ???

              附表:

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

            芯片代號 紋理單元數(shù) 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顯卡頂點、片斷編程支持情況

            芯片代號 紋理單元數(shù) 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不太方便,要么是函數(shù)調(diào)用,要么是匯編碼,相當于用x86匯編編寫PC程序,而現(xiàn)在已經(jīng)有了面向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)腳本

            • 直接在程序中調(diào)用Cg提供的API,運行Cg程序

            • 編譯成DirectX的 vertex shader / pixel shader

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

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

            ?

               RenderMonkey

              RenderMonkey并不是一種語言,而是ATI推出的一個編寫調(diào)試vertex program和fragment program的集成開發(fā)環(huán)境,目前只支持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)的開發(fā)。使用GL_NV_register_combiners和GL_NV_texture_shader擴展實現(xiàn)片斷編程全是函數(shù)調(diào)用的形式,很不方便,而nVIDIA為了簡化RC和TS程序開發(fā),建立了一種腳本格式,用簡單的腳本代替復雜的GL_NV_register_combiners和GL_NV_texture_shader函數(shù)調(diào)用,nvParse則提供API用于解釋執(zhí)行RC和TS腳本。

            ??

            模擬NV30

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

            ??

            后記

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

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

            国产韩国精品一区二区三区久久| av午夜福利一片免费看久久| 久久夜色精品国产亚洲av| 久久久久久国产精品美女 | 国内精品久久久久久久涩爱 | 久久精品亚洲福利| 一极黄色视频久久网站| 久久精品中文无码资源站| 99久久精品国产麻豆| 99久久国产免费福利| 热久久视久久精品18| 97超级碰碰碰久久久久| 久久亚洲天堂| 一本久久久久久久| 国内精品综合久久久40p| 久久夜色tv网站| 亚洲国产精品无码久久98| 久久久久国色AV免费看图片| 精品乱码久久久久久久| 日本WV一本一道久久香蕉| 国内精品伊人久久久久影院对白| 久久人人爽人人爽人人片av麻烦 | 亚洲色欲久久久久综合网 | 亚洲国产视频久久| 国产激情久久久久影院老熟女免费| 久久精品免费一区二区| 国内精品久久久久久久亚洲| 99精品久久久久中文字幕| 国产成年无码久久久免费| 久久这里都是精品| 亚洲午夜精品久久久久久浪潮| 久久久久99精品成人片三人毛片 | 久久精品视屏| 久久久久无码精品| 999久久久免费国产精品播放| 91精品国产综合久久久久久| 无码AV中文字幕久久专区| 日韩精品久久无码人妻中文字幕| 久久夜色精品国产亚洲| 久久天天躁狠狠躁夜夜不卡| 久久婷婷五月综合色奶水99啪|