2011-07-27 12 views
1

これは気になることですが、構造体パラメータをCgシェーダから取得するより良い方法がありますか? 11_two_light_with_structs例(OpenGLの)でCgシェーダから構造体パラメータを取得する

は、構造体の材質は、シェーダーにあります:

のCgシェーダー:

Cコード:

// From page 128 
struct Material { 
    float3 Ke; 
    float3 Ka; 
    float3 Kd; 
    float3 Ks; 
    float shininess; 
}; 

は、その後のコードで、彼らはこれを行います:

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

、ここで

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

私は配列として構造体を処理するためにしようとしているが、その最後のコマンドは、しかし動作しません:退屈なMSは、あなただけの後のようなものを

myCgVertexParam_materialALL = cgGetNamedParameter(myCgVertexProgram, "material") ; 

を行うことはできません「パラメータは数値型ではありません」というエラーが表示されます。

答えて

0

ちょうどこのようにしているのです。

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

それだけです!

関連する問題