[ glorius @ 26.03.2010. 17:53 ] @
Pokusavam da iskoristim direktive u shaderu tako sto ih definisem pomocu D3DXMACRO strukture.

Testirao sam jednostavnim shaderom:

Code:


SHADER_CODE

uniform extern float4x4 g_matWVP;

void LightingVS(float3 posL : POSITION0, float2 texCoord : TEXCOORD0, 
                out float4 oPosH : POSITION0, out float2 oTexCoord : TEXCOORD0)
{
    oPosH = mul( float4( posL, 1.0f ), g_matWVP );
    oTexCoord = texCoord;
}

float4 LightingPS(float2 texCoord : TEXCOORD0) : COLOR0
{
    float4  color = 0;
    
    #ifdef COLOR_RED
        color =  float4(1.0f, 0.0f, 0.0f, 1.0f);
    #endif
    
    #ifdef COLOR_BLUE
        color =  float4(0.0f, 0.0f, 1.0f, 1.0f);
    #endif
    
    return color;
}

technique techLighting
{
    pass p0
    {
        vertexshader = compile vs_2_0 LightingVS();
        pixelshader = compile ps_2_0 LightingPS();    
    }
}



Code:


APP_CODE

D3DXMACRO m;
m.Name = "COLOR_RED";
m.Definition = "1";

D3DXCreateEffectFromFile(m_pDevice, L"Shaders/Lighting.fx", &m, 0, 0, 0, &m_pLightingShader, &errors);



Problem je sto se shader ne ucitava, cak i ne prodje ovu (D3DXCreateEffectFromFile) liniju (aplikacija puca) tako da ne mogu da vidim compilation errors.
Bez ovih definicija shader radi ok.

U C++, kao sto znamo, je dovoljno napisati #define COLOR_RED ali posto D3DXMACRO zahteva i Definition parametar ja sam stavio 1.

Ne znam gde gresim.


[ glorius @ 27.03.2010. 10:49 ] @
oGooglao sam malo i nasao resenje problema.

umesto:

D3DXMACRO m;
m.Name = "COLOR_RED";
m.Definition = "1";

strukturu m treba definisati ovako:

D3DXMACRO m[] = { {"COLOR_BLUE", "1"}, {0, 0} };

Izgleda da se funkciji D3DXCreateEffectFromFile explicitno mora navesti gde je kraj liste parametara {0, 0}.

Izgleda da je D3DXMACRO lose dokumentovan. Resenje sam nasao ovde:
http://www.gamedev.net/community/forums/topic.asp?topic_id=270661



[ Filip Strugar @ 27.03.2010. 12:57 ] @
Citat:
glorius:
Izgleda da se funkciji D3DXCreateEffectFromFile explicitno mora navesti gde je kraj liste parametara {0, 0}.

Izgleda da je D3DXMACRO lose dokumentovan. Resenje sam nasao ovde:
http://www.gamedev.net/community/forums/topic.asp?topic_id=270661


Khm, ne razumem bas u cemu je problem, sve lepo pise u MSDN dokumentaciji D3DXCreateEffectFromFile() i ostalih funkcija koje primaju D3DXMACRO parametar :)

Citat:

pDefines [in] D3DXMACRO

Optional NULL-terminated array of preprocessor macro definitions. See D3DXMACRO.
[ glorius @ 27.03.2010. 15:50 ] @
Uf, izgleda da nisam lepo video da je null-terminated array koje, do duse, nisam cesto sretao osim u primerima sa null-terminated stringovima :)
[ Filip Strugar @ 28.03.2010. 13:20 ] @
Jes malo nelogicno - bilo bi smislenije da funkcija prima jos jedan argument koji je broj parametara.

Makar su za D3D10/11 verziju sredili dokumentaciju, malo je jasnije:

Citat:

HRESULT D3DX11CompileFromFile(...)

pDefines [in] D3D10_SHADER_MACRO

Optional. Pointer to an array of macro definitions (see D3D10_SHADER_MACRO). The last structure in the array serves as a terminator and must have all members set to 0. If not used, set pDefines to NULL.



Btw, ako mozes (imas Vistu/Win7) toplo preporucujem da koristis DirectX11 (DirectX10) - mnogo je jednostavniji, bolje organizovan i razumljiviji za rad!
(Ne treba ti DirectX11 graficka, bilo koja DirectX10 - npr NV8800 - ce da radi posao)
[ glorius @ 28.03.2010. 14:36 ] @
Da, slazem se da su mogli da ubace jos jedan arg funkcije mada je ovo, moze se reci, zanimljiv pristup.

Citao sam malo dokumentaciju DX10 i DX11 i proucio primere DX10 i stvarno je sve bolje organizovano.

Inace, imam Vistu i 8600GT.

Mozda je pogresan pristup ali ja bih ipak da se drzim DirectX-a 9 dok ga ne proucim do nekog zadovoljavajuceg nivoa. Kasnije cu 10 i 11 verovatno moci brze da savladam.