четверг, 14 августа 2008 г.

Cg 2.1 Beta

Вышел 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 комментария:

Arseny Kapoulkine комментирует...

Дело в том, что у компилятора есть две части, frontend и backend.

frontend грубо говоря переводит Cg код в некое внутреннее представление, набор абстрактных команд обычно (псевдоассемблер).

backend берет набор абстрактных команд, и транслирует его в target код. Засчет этого удается достаточно недорого поддерживать много профилей.

В случае с компиляцией glsl кода (т.е. когда на входе компилятора glsl код, а на выходе например d3d ассемблер) меняется frontend, но не меняется backend, таким образом glsl можно компилировать в любой из поддерживаемых профилей.

В случае с компиляцией в glsl код (профили glslv/f) или с компиляцией в d3d10 меняется backend, но не меняется frontend. Поскольку backend-у приходит программа в виде псевдоассемблера (называется вроде корректно обычно промежуточный код), то он выдает примерно то что выдает

Andrey комментирует...

Спасибо за пояснение.