

Je ne comprends rien aux shaders! J'y ai passé une partie du week-end, mais sans grand résultat. Soit il me manque les connaissances de bases, soit je suis un gros boulet. (ou les deux. Probablement les deux.)
J'ai écumé les forums d'Ogre, j'ai étudié les rares codes PB dispo à m'en user la rétine (merci Djes, au passage), rien à faire: je n'arrive pas à faire le lien entre le code du shader et les choses à mettre dans le fichier ".material". C'est frustrant. Je suis frustré.
Voici ma situation:
- Je dispose du shader HLSL suivant, dont le but est d'afficher la scène 3D en anaglyphes:
Code : Tout sélectionner
// Simple 3D shader
// Created 15 April 2009, edited 16 April 2009.
float4x4 wvp : worldviewproj_matrix;
float4x4 wv : worldview_matrix;
float4x4 proj : projection_matrix;
float4 camOffset = {2.0, 0.0, 0.0, 0.0};
float4 leftColour = {0.0, 1.0, 1.0, 1.0};
float4 rightColour = {1.0, 0.0, 0.0, 1.0};
texture baseTexture < string ResourceName = ""; >;
sampler baseSample = sampler_state
{ texture = <baseTexture>;
mipFilter = linear;
magFilter = linear;
minFilter = linear;
addressU = wrap;
addressV = wrap;
};
struct VSInput
{ float4 pos : position;
float2 UV : texcoord0;
};
struct VSOutput
{ float4 pos : position;
float2 UV : texcoord0;
};
struct PSInput
{ float2 UV : texcoord0;
};
struct PSOutput { float4 col : color; };
VSOutput leftVShader(VSInput In, VSOutput Out)
{ // convert to camera coords and shift to left
float4 vPos = mul(wv, In.pos) - camOffset;
// convert to screen coords
Out.pos = mul(proj, vPos);
Out.UV = In.UV;
return Out;
}
VSOutput rightVShader(VSInput In, VSOutput Out)
{ // convert to camera coords and shift to right
float4 vPos = mul(wv, In.pos) + camOffset;
// convert to screen coords
Out.pos = mul(proj, vPos);
Out.UV = In.UV;
return Out;
}
PSOutput leftPShader(PSInput In, PSOutput Out)
{ Out.col = tex2D(baseSample, In.UV) * leftColour;
return Out;
}
PSOutput rightPShader(PSInput In, PSOutput Out)
{ Out.col = tex2D(baseSample, In.UV) * rightColour;
return Out;
}
technique test
{ pass left
{ vertexShader = compile vs_2_0 leftVShader();
pixelShader = compile ps_2_0 leftPShader();
depthBias = 0.0005;
}
pass right
{ vertexShader = compile vs_2_0 rightVShader();
pixelShader = compile ps_2_0 rightPShader();
depthBias = 0;
alphaBlendEnable = true;
blendOp = add;
srcBlend = one;
destBlend = one;
}
}
Code : Tout sélectionner
vertex_program left_vs hlsl
{
source Anaglyph.fx
entry_point leftVShader
target vs_2_0
}
fragment_program left_ps hlsl
{
source Anaglyph.fx
entry_point leftPShader
target ps_2_0
}
vertex_program right_vs hlsl
{
source Anaglyph.fx
entry_point rightVShader
target vs_2_0
}
fragment_program right_ps hlsl
{
source Anaglyph.fx
entry_point rightPShader
target ps_2_0
}
material teapot
{
technique
{
pass left
{
vertex_program_ref left_vs
{
}
fragment_program_ref left_ps
{
}
texture_unit
{
}
}
pass right
{
vertex_program_ref right_vs
{
}
fragment_program_ref right_ps
{
}
texture_unit
{
}
}
}
}
Et puis, dans le code du shader, il y a du code, soit que je ne comprends pas, soit dont je devine l'utilité mais que je n'arrive pas à exploiter:
- Pourquoi les "worldviewproj_matrix" et autres ne sont-ils pas déclarés en paramètres d'entrée du shader?
- Et pourquoi il n'y pas pas de "main_vp" ou autre entry_point évident?
- Comment pourrais-je référencer ou appeler la technique décrite dans le shader? ça m'éviterait de la re-décrire dans le ".material", non?
Bref: je n'y entrave que dalle. Quelqu'un pourrait-il me donner un coup de pouce? Pitié!
Ps: voici un petit ".zip" qui contient le code, le mesh et tout ce que j'utilise pour tester (Le code PB est de Djes, encore grand merci à lui).
http://keleb.free.fr/pb/anaglyph.zip