2011-07-27 46 views
1

我覺得這很討厭,但是有沒有更好的方法從Cg着色器中檢索結構參數?從Cg着色器檢索結構參數

11_two_light_with_structs例子(OpenGL的),還有在着色器結構材料:

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"); 

請參閱MS乏味,你不能只是做

myCgVertexParam_materialALL = cgGetNamedParameter(myCgVertexProgram, "material") ; 

然後是這樣的:

cgSetParameterValuefr(myCgVertexParam_materialALL, 13, brassMat) ;//! no. 

在這裏,我想對待結構作爲一個數組,但最後一個命令不工作,雖然,出現錯誤「參數不是數字類型」。

回答

0

Cg就是這樣做的,它就是這樣。

HLSL/D3D11通過CBUFFERS的概念改善了這一點。你最終可以做的是在你的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
cbuffer Globals : register(b0) 
{ 
    // the concatenated modelview-projection matrix 
    float4x4 modelViewProj ; 
    float4 diffuseLightPos ; 
    float4 diffuseLightColor ; 
    float4 specularLightPos ; 
    float4 specularLightColor ; 
    float4 eyePos ; 
} ; 

然後從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); 

就是這樣!