Получение параметра структуры из шейдера Cg - PullRequest
1 голос
/ 27 июля 2011

Я нахожу это раздражающим, но есть ли лучший способ извлечь параметр структуры из шейдера 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");

Кажется скучным, не могли бы вы просто сделать

myCgVertexParam_materialALL = cgGetNamedParameter( myCgVertexProgram, "material" ) ;

Тогда что-то вроде:

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

Здесь я пытаюсь обработать структуру как массив, но последняя команда не работает, хотя с ошибкой «Параметр не числового типа».

1 Ответ

0 голосов
/ 15 октября 2011

Cg просто делает это так, и это то, что есть.

HLSL / D3D11 действительно улучшает это с концепцией CBUFFERS . В итоге вы можете создать структуру C-style в своем коде 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 );

И это все!

...