TV3D et PureBasic...

Généralités sur la programmation 3D
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Salut,

Je me suis abonné a ce forum. De plus, étant "licencié" PureBasic cela me semble normal :)
Je trouve formidable le travail de TMyke avec ce wrapper, et je m'attaque a la partie de Truevision qui me passionne le plus : les shaders, le seul vrai apport de DX9 en comparaison des anciennes version. Comme indiqué sur les forums de Blitz3DFr ( http://filax.celeonet.fr/_fofo/index.php?topic=3436.0 ), mes tests a propos de ceux-ci ( shaders ) sont plutôt concluants. Reste encore des soucis a propos des posts/Prés traitements. Je finirais par comprendre :D
Ces tests sont réalisés a l'aide de ModelView. Aurais-tu Tmyke, un exemple Pure utilisant l'instruction CreateFromEffectFile qui permet le chargement d'un shader ( fichier .FX ) externe. Merci

JP
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Salut JP, et bienvenue ici ;)

Non, je n'ai pas d'exemple tout fait, mais je vais bien avoir 5 mn pour te pondre cela d'ici à
ce soir...
Et puis, cela me permettra de valider certaines instructions par encore vraiment utilisées à travers le wrap :)

(arrgg, un amateur de 3D en plus sous Pure, on va y arriver, on va y arriver 8) )
Force et sagesse...
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Bon, j'ai complété l'archive avec deux exemples de plus, sample28 et sample29 (faut donc re-télécharger TV3D_PB_WRAP.zip),
qui illustre l'emploi de shader, dont un post screen shader. Voilà, en espérant que cela
corresponde à ce que tu attendais ;)
Force et sagesse...
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Je re-télécharge, et je testerai cela. Commentaires a suivre. :)

JP

Edit : Premières impressions : Les 3 shaders livrés sont une BONNE base de travail. Les exemples sont tip_top. Merci 8)

Edit 2 :
Est-il possible d'avoir un AVI sur un mesh ( ou quad )? >>>>> IMPORTANT. Un exemple si possible. Merci

Edit 3 :
Et un post/shader. Un. "monochrome.shade" pour l'exemple n°29
Hé hé hé. :D

Code : Tout sélectionner

// Monochrome.shade JP972/Truevision
texture SceneTexture;

sampler2D ScreenSampler = sampler_state
{
	Texture         = (SceneTexture);
	MIPFILTER       = LINEAR;
	MINFILTER       = LINEAR;
	MAGFILTER       = LINEAR;
};

struct a2v
{
	float4 Position: POSITION;
	float2 UV      : TEXCOORD0;
};

struct v2p
{
	float4 Position: POSITION;
	float2 UV      : TEXCOORD0;
};

struct p2s
{
	float4 Colour  : COLOR0;
};

void vs( in a2v IN, out v2p OUT )
{
	OUT.Position    = IN.Position;
	OUT.UV          = IN.UV;
}

float4 ps(in v2p IN, out p2s OUT ) : COLOR
{
	float4 Scene_Color = tex2D(ScreenSampler, IN.UV);
	
	Scene_Color.rgb = (Scene_Color.r+Scene_Color.g+Scene_Color.b)/3.0f;
	return Scene_Color;
}

technique null
{
   pass Pass0
   {
    VertexShader = compile vs_1_1 vs();
    PixelShader = compile ps_2_0 ps();
   }
}
Dernière modification par JP972 le dim. 29/mars/2009 7:33, modifié 1 fois.
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Un autre post shader qui secoue 8)

JP

PS : On doit pouvoir l'appliquer aux vertex et secouer les "entités". A suivre. Je fatique un peu. 23H40.

Dans le source sample29, remplacer

Code : Tout sélectionner

TVMesh_RotateY(*cube, 0.01,0)
Par

Code : Tout sélectionner

TVMesh_RotateY(*cube, 0.01,0)
TVShader_SetEffectParamFloat(*shader, "Shock", Random(10))
Tmyke, cela valide l'instruction TVShader_SetEffectParamFloat. :D

Le shader shock.shade

Code : Tout sélectionner

//  Shock.shade JP972/Truevision
//  

texture SceneTexture;
float Shock;

sampler2D ScreenSampler = sampler_state
{
	Texture         = (SceneTexture);
	MIPFILTER       = LINEAR;
	MINFILTER       = LINEAR;
	MAGFILTER       = LINEAR;
};

struct a2v
{
	float4 Position: POSITION;
	float2 UV      : TEXCOORD0;
};

struct v2p
{
	float4 Position: POSITION;
	float2 UV      : TEXCOORD0;
};

struct p2s
{
	float4 Colour  : COLOR0;
};

void vs( in a2v IN, out v2p OUT )
{
	OUT.Position    = IN.Position;
	OUT.UV          = IN.UV;
}
float4 ps(float2 inTexcoord : TEXCOORD0) : COLOR
{
	float normShock = Shock * 0.002f;
	return float4(tex2D(ScreenSampler, inTexcoord * 1.0f + float2(normShock*0.2f, normShock*0.13f) * 2.0f).rgb, 2.0f);
}

technique t0
{
   pass Pass0
   {
    VertexShader = compile vs_1_1 vs();
    PixelShader  = compile ps_2_0 ps();
   }
}
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Encore la à 2H30 du mat. Nouveau shader. Modif a partir d'un Nvidia.
Godray.shade pour le sample28.pb

Code : Tout sélectionner

// GodRay.shade
float4x4 gWorldXf   : World ;
float4x4 gWorldITXf : WorldInverseTranspose ;
float4x4 gWvpXf     : WorldViewProjection ;
float4x4 gViewIXf   : ViewInverse;

float gDD  = 15.0; //  MODIF ICI ++++++++++++++++++++++++++++++++
float gIntensity = 8.0f; //  MODIF ICI ++++++++++++++++++++++++++++++++
float gGlowGamma  = 1.8f;//  MODIF ICI ++++++++++++++++++++++++++++++++
float gBlurStart  = 1.0f;//  MODIF ICI ++++++++++++++++++++++++++++++++
float gBlurWidth  = -6.0f;//  MODIF ICI ++++++++++++++++++++++++++++++++
float gRepeat = 1.2;
bool gFlipY  = false;

// 
texture Texture_Model ; // a voir
sampler2D gImageSampler = sampler_state 
{
    Texture = (Texture_Model);
    MinFilter = Linear;
    MipFilter = Linear;
    MagFilter = Linear;
    AddressU = Border;
    AddressV = Border;
};

/**************************************/
/** Connectors ************************/
/**************************************/

struct appdata {
    float3 Position	: POSITION;
    float2 UV		: TEXCOORD0;
    float4 Normal	: NORMAL0;
};

struct texposVertexOutput {
    float4 HPosition	: POSITION;
    float2 UV	        : TEXCOORD0;
    float4 ScreenCoords	: TEXCOORD1; // we copy HPosition into this
};

/****************************************/
/*** SHADERS ****************************/
/****************************************/

texposVertexOutput ddTexVS(appdata IN, uniform float4x4 WorldITXf,	uniform float4x4 WorldXf,	uniform float4x4 ViewIXf,	uniform float4x4 WvpXf,   uniform float Repeat,    uniform bool FlipY) 
{
    texposVertexOutput OUT = (texposVertexOutput)0;
    float4 Po = float4(IN.Position.xyz,1.0);
    OUT.HPosition = OUT.ScreenCoords = mul(Po,WvpXf);
    const float2 uvCenter = float2(0.45,0.45); //  MODIF ICI ++++++++++++++++++++++++++++++++
    float2 nuv = IN.UV - uvCenter;
    if (FlipY) 
	{
		nuv.y = - nuv.y;
    }
    OUT.UV = float2(max(0.001,Repeat) * nuv.x, max(0.001,Repeat) * nuv.y) + uvCenter;
    return OUT;
}

float4 ddTexPS(texposVertexOutput IN,
	    uniform sampler2D ColorSampler,
	    uniform float DD,		// overall effect scaling
	    uniform float BlurStart,	// range of blor values
	    uniform float BlurWidth,
	    uniform float Intensity,	// color manipulation of glow
	    uniform float GlowGamma,
	    uniform int nsamples	// how much sampling
) : COLOR
{
    // location on screen relative to image center
    float2 sUV = float2(IN.ScreenCoords.x/IN.ScreenCoords.w,IN.ScreenCoords.y/IN.ScreenCoords.w);
    // we just want this as a 2D direction, so normalize it
    sUV = normalize(sUV); 
    // duv will be our screen-radial 2D UV vector -- that is, our step size in UV based
    //    on the local partial derivatives of UV in screen-x and screen-y.
    //    Note that ddx()/ddy() return "float2" here
    float2 duv = (sUV.x * ddx(IN.UV)) - (sUV.y * ddy(IN.UV));
    duv *= DD;
    // now we can use this step to accumulate our color samples
    float4 blurred = 0;
    for(int i=0; i<nsamples; i++) {
    	float scale = BlurStart + BlurWidth*(i/(float) (nsamples-1));
    	blurred += tex2D(ColorSampler, IN.UV + scale * duv);
    }
    blurred /= nsamples;
    // tweak the color a bit
    blurred.rgb = pow(blurred.rgb,GlowGamma);
    blurred.rgb *= Intensity;
    blurred.rgb = saturate(blurred.rgb);
    // now composite original pic back on top of the blur
    float4 origTex = tex2D(ColorSampler, IN.UV);
    float3 newC = origTex.rgb + (1.0-origTex.a)*blurred.rgb;
    float newA = max(origTex.a,blurred.a);
    return float4(newC.rgb,newA);
}


technique Main 
 {
    pass p0
	{
        VertexShader = compile vs_3_0 ddTexVS(gWorldITXf,gWorldXf,gViewIXf,gWvpXf,   gRepeat, gFlipY);
		ZEnable = true;
		ZWriteEnable = true;
		ZFunc = LessEqual;
		AlphaBlendEnable = false;
		CullMode = None;
        PixelShader = compile ps_3_0 ddTexPS(gImageSampler,gDD,	gBlurStart,gBlurWidth,gIntensity,gGlowGamma,32);
    }
}

tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Ouha, je vois que tu t'éclate avec les shaders. C'est fort intéressant et très instructif qui plus est.
Va falloir que je teste tout ça en tous les cas :)
JP972 a écrit :Est-il possible d'avoir un AVI sur un mesh ( ou quad )? >>>>> IMPORTANT. Un exemple si possible. Merci
Là tu me pose une colle, je pense que c'est possible oui, mais je ne sais pas encore comment.
Faudrait faire un tour sur le forum de TV3D pour en savoir éventuellement plus. Adapter un code C++ ou C# vers PB pour
TV3D est très facile.
Force et sagesse...
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Salut,
Visiblement j'ai soulevé LE problême de TV. :cry: Cela semble plus difficile a faire. Une recherche Google genre "avi site:www.truevision3d.com" ne donne aucun résultat satisfaisant.

JP
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

As-tu essayer de poser la question sur le forum officiel des fois ? Quelqu'un pourrait fournir
une piste ....
Force et sagesse...
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

La solution : TVMedia en cours de développement.
Sinon, a voir avec une lib (DLL) a condition d'avoir des infos sur le pointeur des textures :)

JP
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Sinon a voir en passant directement par PureBasic. Si avec PB tu peux rendre une video
AVI sur un SPRITE3D par exemple, alors je pense que tu aurais fait plus de la moitier du chemin,
la passerelle vers TV3D étant certainement très faisable par la suite...
Force et sagesse...
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Exact. Cela dit, il faudra dans ce cas aussi connaitre le pointeur memoire des textures sous TV, ainsi que celui des sprites (3d ou pas) de Pure de façon a faire passer les images de l'un (Pure/sprite) à l'autre (PureTV/texture). :wink:
Les AVIs sont importants pour moi, car c'est la base d'un projet pro ( Publicité ) entamé sous Blitz3D 8)
Sinon, les shaders sous TV, je trouve cela très "sympa". Contrairement a mes croyances, le Fx Composer de Nvidia se revêle plus compliquer a adapter que Rendermonkey d'ATI. C'est dommage car le bibliothèque de shaders de Nvidia est plus complête :?
Pas grave. Je commence a prendre le "coup" dans les adaptations. A suivre...

JP
Edit : J'espère que tu ne t'es pas fait d'ennemis avec ton wrapper. Genre PureGDK fanboy :D
Edit2 : Pas de wrapper pour Blitz3D? :D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

JP972 a écrit :J'espère que tu ne t'es pas fait d'ennemis avec ton wrapper. Genre PureGDK fanboy :D
Je te dirais que je n'y ai même pas pensé pour être honnette. Je ne suis même pas
sûr qu'il sache que cela existe pour Pure, n'ayant pas vraiment communiqué là dessus
en dehors de ce forum. ;)
JP972 a écrit : Pas de wrapper pour Blitz3D? :D
Je pense que c'est faisable, mais je me consacre quasiment à 100% au grand frère
de Dreamotion3D, et donc je n'ai pas vraiment le temps pour faire autre chose.
A l'origine, mon excursion TV3D+PB était une simple récréation, même si je me fait fort
d'assurer un minimum de support pour ce petit projet.
Ceci dit, pour B3D, il suffirait à une personne un tant soit peu courageuse de wrapper le
truc, cela ne doit pas poser plus de problème que cela, en partant du wrap PB ;)
JP972 a écrit :Exact. Cela dit, il faudra dans ce cas aussi connaitre le pointeur memoire des textures sous TV
ça, faudrait creuser, mais cela doit être possible. Après, le tout est d'arriver à récupérer les
info graphique de la video...
Force et sagesse...
JP972
Messages : 18
Inscription : sam. 28/mars/2009 15:53

Message par JP972 »

Salut.

Quatre heures de boulot pour obtenir ma version simplifiée, facile a "comprendre" d’un shader de Fur. :D

Image

Téléchargement ici
http://www.zinfo972.net/avatar/tv3d_fur.rar

Tmyke, je me suis permis de modifier un de tes exemples pour en faire un nouvel. Le 30. C’est un test du shader FUR. Tout est dans le .RAR

JP

Edit :
Je te dirais que je n'y ai même pas pensé pour être honnette. Je ne suis même pas
sûr qu'il sache que cela existe pour Pure, n'ayant pas vraiment communiqué là dessus
en dehors de ce forum.
Cela se saura. Pas de soucis.
A l'origine, mon excursion TV3D+PB était une simple récréation, même si je me fait fort
d'assurer un minimum de support pour ce petit projet.
Petit projet. Heu, cela semble parti pour être un gros truc
Ceci dit, pour B3D, il suffirait à une personne un tant soit peu courageuse de wrapper le
truc, cela ne doit pas poser plus de problème que cela, en partant du wrap PB
Une personne. Hahaha. Tu semble la personne la plus appropriée pour cela. Va falloir patienter :lol:
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

JP972 a écrit :Salut.

Quatre heures de boulot pour obtenir ma version simplifiée, facile a "comprendre" d’un shader de Fur. :D

Tmyke, je me suis permis de modifier un de tes exemples pour en faire un nouvel. Le 30. C’est un test du shader FUR. Tout est dans le .RAR
Pas de soucis, tu peux employer les exemples comme tu le souhaites... Et je vais tester ton exemple dès demain soir en rentrant. ;)
Le screen rend déjà vraiment bien...

JP972 a écrit :Une personne. Hahaha. Tu semble la personne la plus appropriée pour cela. Va falloir patienter :lol:
Tusembles toujours très attaché à Blitz3D, non ?
Force et sagesse...
Répondre