流水帳,隨手記下:
- 直到現(xiàn)在我才明白,CG是CG,CGFX是CGFX,CG是一種語言,CGFX是一套編程模型,而我們要做的是封裝cgFX,有了CGFX就有更強(qiáng)的一種表達(dá),可以對(duì)不同的Profile指定配置,可以設(shè)定openGL state。
- 對(duì)于D3D的繪制方式而言,是根據(jù)名字得到Technique的句柄,然后每次繪制Mesh前設(shè)定生效的Technique,在遍歷該Technique下的所有Pass,逐一進(jìn)行繪制;
- 那么對(duì)于OpenGL來說,我們只知道在CreateProgram的時(shí)候指定一個(gè)入口函數(shù),那對(duì)于具有多個(gè)Technique的情況我們還不知道怎么進(jìn)行切換,是用兩個(gè)Program表示呢,還是調(diào)用什么參數(shù)可以切換?
- 但是不管怎么表示,從概念上是應(yīng)該允許像D3D那樣指定的,即在某一個(gè)Mesh繪制前指定用某一個(gè)Effect的某一個(gè)Technique,甚至Pass。
- 后來查到在cg1.2發(fā)布的cg_tookit里邊提供了CgFx的很好的支持,能夠想D3D Effect格式那樣ICgFxEffect->setTechnique(),有pass->begin(),pass->end()這種方法,但是不知道為什么到cg1.4把這些東西去掉了。在cgReleaseNote里邊寫到:
- Complete rewrite of CgFX, including an API integrated with the Cg runtime API, support for extensible, cross-platform graphics state management, and support for unsized arrays and interfaces.
??? 就是說重寫了,跟以前不一樣兒了,后邊給了對(duì)于使用CgFx庫的說明:
- Applications and effects that used previous versions of CgFX will require modification.Applications that use CgFX will have to be modified to use the new CgFX API. If the supplied OpenGL state manager for CgFX is used, the effect files themselves must be modified. The effects must be changed to use OpenGL state assignments, rather than the D3D state assignments supported in prior versions of CgFX. A subsequent release of Cg will provide D3D and cross-platform state managers for CgFX.
- CgFX has been redesigned and re-implemented. As noted above, existing applications that use CgFX must be modified if the new API is to be used. In addition, if you wish to use the supplied “native” OpenGL state manager, which assumes that OpenGL-style state names and vales are used in effects, existing effects must be modified to use OpenGL-style states. See the “Introduction to CgFX” chapter in the Cg Users Manual for more details. If you have questions or problems related to porting existing CgFX applications, please contact NVIDIA developer relations.
太惡心了,就是說原來如果你用了很好實(shí)現(xiàn)的CgFx,現(xiàn)在對(duì)不起,不能用了。所以我看到的早期的使用cg1.2的nebula2都封裝了CGFX,但是到了1.4不知道為什么,發(fā)布的CG_tookit里邊卻去掉了這個(gè)CGFX的運(yùn)行庫。nebula2新的版本也去掉了CGFX,只剩下D3DShader的支持。
上邊這段話最后說如果有問題,聯(lián)系Nvidia developer relations。我想一想也沒有辦法了,去問wj大牛都不知道怎么回事兒,那只好去問一下了,結(jié)果到了nvidia developer網(wǎng)站上也差不到可以直接問誰,還填了一張表注冊(cè)了一個(gè)用戶,現(xiàn)在還沒有被批下來。最后實(shí)在等不及了,去論壇上問吧。下面幾個(gè)地址,沒準(zhǔn)兒有熟知cg的人可以答復(fù)一下.
http://www.gamedev.net/community/forums/topic.asp?topic_id=389475
?
http://www.smth.org/bbscon.php?bid=50&id=43518
?
http://www.smth.org/bbscon.php?bid=197&id=50169
?
http://forums.nvidia.com/index.php?showtopic=13875
再看看Nvidia到底怎么說的:
CgFX beta support for DirectX 8, DirectX 9, and OpenGL
Cg Effects Explained document?
CgFX beta support for DirectX 8, DirectX 9, and OpenGL
Complete rewrite of CgFX, including an API integrated with
the Cg runtime API, support for extensible, cross-platform graphics state
management, and support for unsized arrays and interfaces.
- Cg1.5beta里邊關(guān)于cgFX說:
Cg 1.3 and 1.4 style Effects files supported
- 又考察了openGL2.0和GLSL,發(fā)現(xiàn)對(duì)于繪制的描述感覺跟CG1.4的FX的運(yùn)行庫也差不多,又因?yàn)椴皇煜ぃ€是回頭看cgFX吧。
- 裝了cg1.2看原來的文檔,學(xué)習(xí)筆記如下:
- cgFX主要提供了三點(diǎn)好處:
- 不同硬件得以配置(technique,profile)
- 多遍繪制的描述(pass)
- 表達(dá)了環(huán)境信息(state)
- cgFX同microsoft FX2.0和DirectX9.0的Effect格式相似
- cgFX既可以在openGL又可以在D3D上運(yùn)行,便于以后擴(kuò)展
- 主要方法接口:
- CgFXCreateEffect,CgFXCreateEffectFromFileA,CgFXCreateEffectCompiler,CgFXCreateEffectCompilerFromFileA
- CgFXSetDevice,CgFXFreeDevice
- CGFXHANDLE
GetTechnique(UINT index);CGFXHANDLE GetTechniqueByName(LPCSTR name);
- CGFXHANDLE
GetPass(CGFXHANDLE technique, UINT index);CGFXHANDLE
GetPassByName(CGFXHANDLE technique, LPCSTR name);
- CGFXHANDLE
GetParameter(CGFXHANDLE parent, UINT index);
- CGFXHANDLE GetParameterByName(CGFXHANDLE parent, LPCSTR
name);
- CGFXHANDLE GetParameterBySemantic(CGFXHANDLE parent, LPCSTR
name);
- CGFXHANDLE GetParameterElement(CGFXHANDLE parent, UINT
element);
- HRESULT
FindNextValidTechnique(CGFXHANDLE hTechnique,CGFXHANDLE *pTechnique);
- HRESULT
SetTechnique(CGFXHANDLE pTechnique);CGFXHANDLE GetCurrentTechnique();
- HRESULT
Begin(UINT* pPasses, DWORD Flags);HRESULT Pass(UINT passNum);HRESULT
End();
- HRESULT
CloneEffect(ICgFXEffect** ppNewEffect);
- HRESULT GetDevice(LPVOID* ppDevice);
- HRESULT OnLostDevice();
- HRESULT OnResetDevice();
- ICgFXBaseEffect
- ICgFXEffect
- ICgFXEffectCompiler