CGFX学习笔记

CGFX学习笔记

Kagula

2010-04-23

简介

学习环境:

[1]NVIDIA Cg 2.2 October 2009

[2]DirectX SDK 2009 Aug

这里主要是通过DX9目录中cgfx_bumpdemo例程来学习CgFX的调用流程。

正文

第一步:建立全局CGcontext实例,然后建立事件回调函数。

具体参考main函数定义

myCgContext = cgCreateContext();//CGcontext myCgContext;

第二步:在OnResetDeviceInitialization CG

一开始调用cgD3D9SetDevice(pDev);//IDirect3DDevice9* pDev

然后Initialization CG(参考initCG函数定义)

Step2-1:注册CgFX状态,从固定管线接管纹理状态,根据cgfx文件名创建Effect对象。

cgD3D9RegisterStates(myCgContext);//CGcontext myCgContext

cgD3D9SetManageTextureParameters(myCgContext, CG_TRUE)

myCgEffect = cgCreateEffectFromFile(myCgContext, "bumpdemo.cgfx", NULL);

// CGeffect myCgEffect

Step2-2:CGtechnique实例,检查CGtechnique实例的有效性

CGtechnique实例的代码段:

myCgTechnique = cgGetFirstTechnique(myCgEffect);//CGtechnique myCgTechnique

myCgTechnique = cgGetNextTechnique(myCgTechnique);

//返回bumpdemo.cgfx(由myCgEffect对应)中名为“bumpdemo_hlsl”的CGtechnique实例

myCgTechniqueHLSL = cgGetNamedTechnique(myCgEffect, "bumpdemo_hlsl");

检查CGtechnique实例,当前硬件是否支持

(cgValidateTechnique(myCgTechnique) == CG_FALSE) // #define CG_FALSE ((CGbool)0)

辅助功能:

const char * cgGetTechniqueName(myCgTechnique); //返回bumpdemo.cgfx中,指定Technique的名称

Step3-3:根据CgFX文件对应的Effect创建CGparameter实例。

Bumpdemo.cgfx文件的代码片段

float4x4 ModelViewProj : ModelViewProjection;

float OuterRadius = 6;

float InnerRadius = 2;

float3 LightPosition = { -8, 0, 15 };

float3 EyePosition = { 0, 0, 18 };

下面是cgfx_bumpdemo.cpp文件中的代码片段

myCgModelViewProjParam =

cgGetEffectParameterBySemantic(myCgEffect, "ModelViewProjection");

//CGparameter myCgModelViewProjParam

myCgEyePositionParam =

cgGetNamedEffectParameter(myCgEffect, "EyePosition");

//CGparameter myCgEyePositionParam

通常情况下Cg函数失败,会返回零

Step3-4:设置bumpdemo.cfgx运行时(纹理)参数

Bumpdemo.cgfx文件中的相关代码

sampler2D normalMap = sampler_state {

minFilter = LinearMipMapLinear;

magFilter = Linear;

wrapS = Repeat;

wrapT = Repeat;

};

samplerCUBE normalizeCube = sampler_state {

minFilter = Linear;

magFilter = Linear;

wrapS = ClampToEdge;

wrapT = ClampToEdge;

};

Cgfx_bumpdemo.cpp文件中的代码

useSamplerParameter(myCgEffect, "normalMap",

myBrickNormalMap);

// PDIRECT3DTEXTURE9 myBrickNormalMap;

useSamplerParameter(myCgEffect, "normalizeCube",

myNormalizeVectorCubeMap);

// PDIRECT3DCUBETEXTURE9 myNormalizeVectorCubeMap;

下面是useSamplerParameter函数的定义

static void useSamplerParameter(CGeffect effect,

const char *paramName, IDirect3DBaseTexture9 *tex)

{

CGparameter param = cgGetNamedEffectParameter(effect, paramName);

if (!param) {

fprintf(stderr, "%s: expected effect parameter named %s/n",

myProgramName, paramName);

exit(1);

}

cgD3D9SetTextureParameter(param, tex);

cgSetSamplerState(param);

}

第三步:在OnFrameRender事件中设置CGFX运行参数,RenderCGPrimitive图元

Step3-1:设置CGFX程序运行时参数

cgSetMatrixParameterfr(myCgModelViewProjParam, modelViewProjMatrix );

// float modelViewMatrix[16];

cgSetParameter3fv(myCgEyePositionParam, eyePosition);

// float eyePosition[3];

Step3-2: Render

/* Iterate through rendering passes for technique (even

though bumpdemo.cgfx has just one pass). */

pass = cgGetFirstPass(myCurrentCgTechninque);

while (pass) {

cgSetPassState(pass);

调用DrawPrimitive函数,绘制Primitive图元

cgResetPassState(pass);

pass = cgGetNextPass(pass);

}

//myCurrentCgTechninque=>建立联系=>myCgEffect=>建立联系=>bumpdemo.cgfx

第四步:OnLostDevice事件响应

cgD3D9SetDevice(NULL);//对应OnResetDevice事件cgD3D9SetDevice的调用

第五步:程序即将退出,释放CG资源

cgDestroyEffect(myCgEffect);

cgDestroyContext(myCgContext);

cgD3D9SetDevice(NULL);

总结

一个进程中只有一个myCgContext,但是可以有多个myCgEffect(即多个cgfx格式程序文件)。

后言:

希望以后有能力,买台带ATI5870显卡的新机器,研究下DirectX11的新特性,娱乐下。当然,算法才是最重要的。

你可能感兴趣的:(学习笔记)