dx8 sdk : shaders / techniques : blem de blending - Programmation
Marsh Posté le 24-09-2001 à 23:28:44
ben personne ne joue avec le dx8 ????
tout li monde il est opengle ?
Marsh Posté le 25-09-2001 à 10:49:06
Huh non on fait pas tous OGL (dieu m'en garde )
ya' ton ColorOp[1] = BlendFactorAlpha;
qui me plait que moyen je dois dire.
quand ton factorAlpha = 0 alors tu va blender la couleur de ta texture avec 0. donc du noir (logiquement, comme je vois ca)
fodrait juste que tu bricoles la composante alpha et que tu laisse la carte faire le blending entre les deux avec ce alpha.
bref, fo bricoler
Marsh Posté le 25-09-2001 à 10:54:37
arf non,j'ai rien dit
j'avais pas vu que t'avaismis le reste a 0xffffff
donc si il utilise bien ce bout la (et pas la valeur alpha) devrait pas avoir de soucis
m'enfin je sais tjs pas si cette operation necessaire....
Marsh Posté le 25-09-2001 à 11:00:22
ben j'ai cru comprendre dans le sdk que le blendfactoralpha + jouer sur le texturefactor permettait de contrôller la proportion de blending entre les deux arguments.....
et dans l'example "MFC Tex", en mettant les mêmes arguments et opérateurs, ça marche comme je veux !!!!!!!!!!!!
en jouant sur le blendfactor !!!
stage 0: stage 1:
texture texture
modulate blend factor
diffuse current
texture texture
modulate blend factor
diffuse current
avec le diffuse, je joue bien sur la teinte de la texture du stage 0
avec le blendfactor, en changeant l'alpha (octet de poids fort), le mélange se dose bien !!! (comme je veux pour le moment)
alors, là ou il pourrait y avoir méprise:
l'opérateur "Blend Factor" ne correspond pas au "BlendFactorAlpha"
ou la constante "BlendFactor" ne correspond au "D3DRS_TEXTUREFACTOR"
bon, je vais zieuter le source du MFC Tex...
ça devrait expliquer le pourquoi du comment......
Marsh Posté le 25-09-2001 à 11:11:10
autre question accessoire (je sais pas si t'as essayé),
j'ai voulu faire une approche par pixelshader dans la technique T0, en déclarant un pixelshader de ce style:
texture tSR0;
texture tSR1;
pixelshader psST =
asm
{
ps.1.0
tex t0
tex t1
mov r0,t0
add r0,r0,t1
};
technique T0
{
Lighting = False;
SpecularEnable = False;
ZEnable = False;
pass P0
{
Texture[0] = <tSR0>;
Texture[1] = <tSR1>;
pixelshader = <psST>;
}
}
et bizarrement, le pixelshader ne récupère aucune des textures !!!
comment on passe les textures au pixelshader quand celui-ci est dans une technique ??? (un pixelshader seul, po de problème, mais dans une technique morche mol, dumoins j'ai du mol)
j'ai essayé plusieurs combinaisons, gicler les texture[], et/ou associer les textures aux stages (et non aux FOURCC représentant les textures)
et si je mets ça à la place, mon pixelshader écrit bien du jaune (R=1.0,V=0,B=1.0), dans le pixelshader est bien éxécuté, mais il accède po aux textures......
pixelshader psST =
asm
{
ps.1.0
def c5,1.0,1.0,0,1.0
mov r0,c5
};
Marsh Posté le 25-09-2001 à 11:16:39
pour revenir au premier problème, si je remplace le BlendFactor Alpha par un Add ou un Modulate, ça se passe comme si, la deuxième texture était noire !!! (le add rajoute rien, et le modulate donne du noir)......
c'est comme si la texture tSR1 était ignorée !!!! (pourtant ma gf3 le fait finger in the nose, 2 textures en un passe merde!)
et pourtant le Star0 & Star1 sont sélectionnés aléatoirement dans une table de 10 textures d'étoiles (celles du sdk , les shine.bmp
Marsh Posté le 25-09-2001 à 11:24:37
malheureux, des pixels shaders !
sur ma gf2mx !
dis si ca passe sous mfc tex, au lieu demater le code, y'a un bouton qui te genere le code pour l'effet courant
genre
d3ddevice->setTextureStageState(blah)
...
t'as juste a remettre ca en technique pi vouala (normalement )
Marsh Posté le 24-09-2001 à 21:01:19
voila, je me suis fait un ciel étoilé en point sprites, je veux blender 2 textures par point sprite avec le coef de blending qui bouge ds le temps.....
je joue donc avec le texturefactor.......
voici le code c++:
Stars::RenderStars(LPDIRECT3DDEVICE8 D3D_Device)
{
StarsEffect.Interface->SetTexture(MAKEFOURCC('t','S','R','0',StarsTexture[Star0]);
StarsEffect.Interface->SetTexture(MAKEFOURCC('t','S','R','1',StarsTexture[Star1]);
DWORD factor;
factor=(((DWORD)((float)(sin(w)+1.)*255./2.))<<24
)+0x0ffffff;
w+=0.2;
D3D_Device->SetRenderState(D3DRS_TEXTUREFACTOR,fa
ctor);
UINT Passes,p;
StarsTechnique->Begin(&Passes);
for(p=0 ; p < Passes ; p++)
{
StarsTechnique->Pass(p);
Render(D3D_Device,0,numPSprites);
}
StarsTechnique->End();
}
le StarsEffect.Interface, point l'interface d'effet ID3DXEffect
le StarsTechnique est la technique choisie (la 0)......
le TextureFactor varie donc de 0x00ffffff à 0x0ffffffff (y'a que le alpha que je fait bouger)
le fichier de technique que j'utilise:
texture tSR0;
texture tSR1;
technique T0
{
Lighting = False;
SpecularEnable = False;
ZEnable = False;
pass P0
{
Texture[0] = <tSR0>;
Texture[1] = <tSR1>;
ColorArg1[0] = Texture;
ColorArg2[0] = Diffuse;
ColorOp[0] = Modulate;
AlphaArg1[0] = Texture;
AlphaArg2[0] = Diffuse;
AlphaOp[0] = Modulate;
ColorArg1[1] = Texture;
ColorArg2[1] = Current;
ColorOp[1] = BlendFactorAlpha;
AlphaArg1[1] = Texture;
AlphaArg2[1] = Current;
AlphaOp[1] = BlendFactorAlpha;
ColorOp[2] = Disable;
AlphaOp[2] = Disable;
}
}
le pb, c'est que lorsque je mets les deux textures dans la passe 0, ça varie entre la première texture et du noir...
et je commente la déclaration d'utilisation de la deuxième texture, j'ai que la premiere sans variation (logique puisque y'a plus qu'une texture, le deuxième stage est ignoré)
y'a t-il un restriction avec les points sprites qui empèchent d'utiliser deux textures ?
j'ai l'impression que c'est le blendfactoralpha qui alpha qui passe po......
ou alors y'a méprise entre les ColorArg1/2/0 (j'ai vu qu'il y a le 0, mais y causent pas dans le sdk, a part le LERP ???)
Qu'estcequichie ?