我觉得这很烦人,但有没有更好的方法从Cg着色器检索结构参数?
在11_two_light_with_structs示例(OpenGL)中,着色器中有一个struct Material:
<标题> Cg材质:// From page 128
struct Material {
float3 Ke;
float3 Ka;
float3 Kd;
float3 Ks;
float shininess;
};
然后在代码中他们这样做:
<标题> C代码:myCgVertexParam_material_Ke = cgGetNamedParameter( myCgVertexProgram, "material.Ke" );
myCgVertexParam_material_Ka = cgGetNamedParameter( myCgVertexProgram, "material.Ka");
myCgVertexParam_material_Kd = cgGetNamedParameter( myCgVertexProgram, "material.Kd");
myCgVertexParam_material_Ks = cgGetNamedParameter( myCgVertexProgram, "material.Ks");
看起来很乏味,你就不能这样做吗
myCgVertexParam_materialALL = cgGetNamedParameter( myCgVertexProgram, "material" ) ;
然后像这样:
cgSetParameterValuefr( myCgVertexParam_materialALL, 13, brassMat ) ;//! no.
在这里,我试图将结构体视为数组,但最后一个命令不起作用,但错误是"参数不是数字类型。"
标题>标题>Cg就是这样做的,它就是这样。
HLSL/D3D11通过cbuffer的概念改进了这一点。你最终能够做的是在你的c++代码中创建一个C风格的结构体,镜像你的着色器中的所有参数,并将其一次性刷新到gpu,而不必通过愚蠢的变量名:
<标题> c++代码:struct GPUCDATA
{
// the concatenated modelview-projection matrix
float modelViewProj[16] ; // column major
float diffuseLightPos[4] ;
float diffuseLightColor[4] ;
float specularLightPos[4] ;
float specularLightColor[4] ;
float eyePos[4] ;
} ;
<标题> hlslShader.vsh h1> hen from c++:
// gpu is the ID3D11DeviceContext
D3D11_MAPPED_SUBRESOURCE mappedRes ;
CHECK_HRESULT( gpu->Map( gpuCDataBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedRes ), "Map gpucdatabuffer" );
GPUCDATA* gpuMems = (GPUCDATA*)mappedRes.pData ;
memcpy( gpuMems, &gpuCData, sizeof( GPUCDATA ) ) ; // write to the gpu mems.
gpu->Unmap( gpuCDataBuffer, 0 ) ;
gpu->VSSetConstantBuffers( 0, 1, &gpuCDataBuffer );
gpu->PSSetConstantBuffers( 0, 1, &gpuCDataBuffer );
就是这样!
标题>标题>