Вышел Cg 2.1 Beta. Очень радует поддержка Direrct3D10. Не так давно спрашивал про это у nVidia разработчиков, ответили не планируется пока поддержки. Компилятор свой для Direct3D10 они не писали что тоже радует, не будет ошибок и несовместимостей. для компиляции используют функцию D3DX10CompileFromMemory, для получения всех констант используется D3DX10ReflectShader. Не совсем понятно почему результат cgGetProgramString(cgProgram, CG_COMPILED_PROGRAM); выдает hlsl код опять с измененными именами констант, точка входа именуются "main" Вот к примеру результат компиляции:
// hlsl10v output by Cg compiler
// cgc version 2.1.0009, build date Aug 6 2008
// command line args: -q -profile vs_4_0 -entry VSmain -profileopts -d3d
//vendor NVIDIA Corporation
//version 2.1.0.9
//profile vs_4_0
//program VSmain
//semantic ViewProjMatrix : WorldViewProj
//semantic MatTexture : C4
//semantic tex1 : TEXUNIT0
//semantic tex2 : TEXUNIT1
//semantic ShadowMap : TEXUNIT2
//var float4x4 ViewProjMatrix : WorldViewProj : _ZZ2SViewProjMatrix[0], 4 : -1 : 1
//var float4x4 MatTexture : C4 : _ZZ2SMatTexture[0], 4 : -1 : 1
//var sampler2D tex1 : TEXUNIT0 : : -1 : 0
//var sampler2D tex2 : TEXUNIT1 : : -1 : 0
//var sampler2D ShadowMap : TEXUNIT2 : : -1 : 0
//var float4 Pos : $vin.POSITION : POSITION : 0 : 1
//var float2 texCoord : $vin.TEXCOORD0 : TEXCOORD0 : 1 : 1
//var float4 VSmain.Pos : $vout.POSITION : : -1 : 1
//var float2 VSmain.texCoord : $vout.TEXCOORD0 : : -1 : 1
//var float4 VSmain.shadowCrd : $vout.TEXCOORD1 : : -1 : 1
#pragma pack_matrix(row_major)
struct VS_OUTPUT {
float4 Pos : POSITION;
float2 texCoord : TEX0;
float4 shadowCrd : TEX1;
};
struct X1X {
float4 POSITION : SV_Position;
float2 TEX0 : TEX0;
float4 TEX1 : TEX1;
};
float4 _ZZ3SrZh0001;
float4 _ZZ3SrZh0003;
X1X _ZZ3SZDcout;
uniform float4x4 _ZZ2SViewProjMatrix : WorldViewProj;
uniform float4x4 _ZZ2SMatTexture : C4;
// main procedure, the original name was VSmain
X1X main(in float4 _ZZ4SPos : POSITION, in float2 _ZZ4StexCoord : TEX0)
{
VS_OUTPUT _ZZ4SOut;
_ZZ3SrZh0001 = _ZZ4SPos.x*_ZZ2SViewProjMatrix._11_12_13_14;
_ZZ3SrZh0001 = _ZZ3SrZh0001 + _ZZ4SPos.y*_ZZ2SViewProjMatrix._21_22_23_24;
_ZZ3SrZh0001 = _ZZ3SrZh0001 + _ZZ4SPos.z*_ZZ2SViewProjMatrix._31_32_33_34;
_ZZ3SrZh0001 = _ZZ3SrZh0001 + _ZZ4SPos.w*_ZZ2SViewProjMatrix._41_42_43_44;
_ZZ4SOut.Pos = _ZZ3SrZh0001;
_ZZ3SrZh0003 = _ZZ4SPos.x*_ZZ2SMatTexture._11_12_13_14;
_ZZ3SrZh0003 = _ZZ3SrZh0003 + _ZZ4SPos.y*_ZZ2SMatTexture._21_22_23_24;
_ZZ3SrZh0003 = _ZZ3SrZh0003 + _ZZ4SPos.z*_ZZ2SMatTexture._31_32_33_34;
_ZZ3SrZh0003 = _ZZ3SrZh0003 + _ZZ4SPos.w*_ZZ2SMatTexture._41_42_43_44;
_ZZ4SOut.shadowCrd = _ZZ3SrZh0003;
_ZZ4SOut.texCoord = _ZZ4StexCoord;
_ZZ3SZDcout.POSITION = _ZZ4SOut.Pos;
_ZZ3SZDcout.TEX0 = _ZZ4SOut.texCoord;
_ZZ3SZDcout.TEX1 = _ZZ4SOut.shadowCrd;
return _ZZ3SZDcout;
} // main end
Ну на самом деле данный код не планируется подсовывать D3D10CompileShader проще сделать все стандартно
взять ID3D10Blob* из cgD3D10GetCompiledProgram и самому создать шейдер миную Cg RunTime, точно так-же как я сделал в случае использования Cg в OpenGL для профилей
Direct3D9, и OpenGL (glslv,glslf,arbvp1,arvfp1).
В общем можно встраивать это в движок
Лотерея ГринКарт в самом разгаре
год назад
2 комментария:
Дело в том, что у компилятора есть две части, frontend и backend.
frontend грубо говоря переводит Cg код в некое внутреннее представление, набор абстрактных команд обычно (псевдоассемблер).
backend берет набор абстрактных команд, и транслирует его в target код. Засчет этого удается достаточно недорого поддерживать много профилей.
В случае с компиляцией glsl кода (т.е. когда на входе компилятора glsl код, а на выходе например d3d ассемблер) меняется frontend, но не меняется backend, таким образом glsl можно компилировать в любой из поддерживаемых профилей.
В случае с компиляцией в glsl код (профили glslv/f) или с компиляцией в d3d10 меняется backend, но не меняется frontend. Поскольку backend-у приходит программа в виде псевдоассемблера (называется вроде корректно обычно промежуточный код), то он выдает примерно то что выдает
Спасибо за пояснение.
Отправить комментарий