Page 1 sur 2

Anaglyphes

Publié : jeu. 04/mars/2010 11:56
par kelebrindae
Bonjour,

Dans ce code, j'ai essayé de mettre en pratique un truc qui me trottait dans la tête depuis quelques mois. Mais comme je me suis rapidement trouvé bloqué, je poste le code au cas où vous auriez des idées.

En résumé: il s'agit d'afficher une scène 3D en anaglyphes, c'est-à-dire en "vrai" 3D visibles avec ses lunettes marrantes dotées d'un verre rouge et d'un verre bleu. (Dobro saura de quoi je parle, il a pas mal pratiqué la chose).

Pour bien faire les choses, il faudrait:
- Avoir deux caméras légèrement espacées;
- Récupérer l'image vue par chacune d'entre elle;
- Appliquer un filtre bleu sur l'une de ces images, et rouge sur l'autre;
- Afficher à l'écran ces images l'une par-dessus l'autre de façon semi-transparente;

Mais ça, je n'ai pas réussi à le faire. J'avais deux caméras équipée d'un filtre de couleur (un "plain" transparent rouge ou bleu positionné juste devant la caméra), et je voulais faire un "grabSprite" sur chacune d'elle, puis un "displayTranslucentSprite" pour afficher les deux images l'une sur l'autre. Hélas, le "GrabSprite" me renvoie des images vides (toutes noires, quoi). :(

Deuxième approche, moins satisfaisante: je dédouble toutes les entités, et je colle à un morceau un "material" bleu transparent et à l'autre un "material" rouge transparent. Puis j'affiche les deux avec un léger décalage droite/gauche en fonction de sa distance avec la caméra.
Je pense que ça marche (pas pu vérifier: je n'ai pas encore remis la main sur mes lunettes "la créature du lagon noir", distribuées quand le film était passé à "La Dernière Séance" :wink: ), mais ce n'est pas beau car:
- Les objets affichés sont forcément transparents;
- Le nb de polygones affichés est doublé.

Bref: je laisse tomber pour l'instant. Je vous lègue l'exemple suivant (que l'on pourrait intituler "Les nougats dans l'espace"), en espérant que les petits génies du coin auront des idées pour l'améliorer. Ce serait sympa, un jeu PB en "vraie" 3D...

[EDIT] Ah oui: vous pouvez ajuster le rendu en fonction de la taille de votre écran ou de la couleur de vos lunettes grâce aux trois constantes en début de code:
#SEPARATION : écart entre l'image rouge et l'image bleue (x Distance)
#LEFTEYECOLOR : couleur pour l'image de gauche
#RIGHTEYECOLOR : couleur pour l'image de droite

Code : Tout sélectionner

; Author: Kelebrindae 
; Date: march,04, 2010
; PB version: v4.41
; OS: Windows XP


;- Initialisation 
If InitEngine3D() = 0 
  MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 ) 
End 
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 ) 
  End 
EndIf 

Resultat = MessageRequester("Anaglyph","Full Screen ?",#PB_MessageRequester_YesNo) 
If Resultat = 6      
  FullScreen.b=#True
  OpenScreen(800,600,32,"Anaglyph") 
Else            
  FullScreen=#False 
  OpenWindow(0,0, 0, 800 , 600 ,"Anaglyph",#PB_Window_ScreenCentered) 
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0) 
EndIf 

EnableExplicit

; Constants
#CAMERA=0
#CAMERADIST=200
#NBOBJ = 5
#SEPARATION = 0.01

#LEFTEYECOLOR = $FFFF00
#RIGHTEYECOLOR = $0000FF


;- Data structures and definitions
; Mesh creation
Structure vertex_struct
  px.f 
  py.f 
  pz.f 
  nx.f 
  ny.f 
  nz.f 
  Couleur.i 
  U.f 
  V.f 
EndStructure 
Structure triangle_struct 
  f1.w 
  f2.w 
  f3.w 
EndStructure 

; Objects
Structure obj_struct
  nummesh.i
  numentity1.i
  numentity2.i
  
  x.f
  y.f
  z.f
  
  xd.f
  yd.f
  zd.f
  
  xspin.f
  yspin.f
  zspin.f
EndStructure
Global Dim obj.obj_struct(#NBOBJ)

; Camera position and distance from objects
Global xcam.f,ycam.f,zcam.f,cameraAngle.f,dist.f
Global i.i


;- --- Macros ---
Macro DISTANCE(x1,y1,z1,x2,y2,z2)
  Sqr(  ((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2)) + ((z1)-(z2))*((z1)-(z2)) )
EndMacro


;- --- Procedures ---
Procedure.i CreateCube(sizeX.f,sizeY.f,sizeZ.f,Uorigin.f=0,Vorigin.f=0,Uscale.f=1,Vscale.f=1,color.i=$FFFFFF) 

  Protected nbVert.w , nbTri.w              ; Number of vertices and faces
  Protected x.f,y.f,z.f                     ; vertex position
  Protected nx.f,ny.f,nz.f                  ; vertex normals
  Protected u.f,v.f                         ; vertex UV coords (texture mapping)
  Protected *PtrV.vertex_struct,*vertexBuffer.i     ; vertices buffer in memory
  Protected *PtrF.triangle_struct,*triangleBuffer.i ; Faces buffer in memory
  Protected newmesh.i                       ; Procedure Result
  Protected i.i,v1.i,v2.i,v3.i
  
  ; Restore meshdatas
  Restore cube

  ; Read number of vertices and triangles
  Read.w nbVert
  Read.w nbTri

  ; Allocate the needed memory for vertices
  *vertexBuffer = AllocateMemory(SizeOf(vertex_struct)*nbVert) 
  *PtrV = *vertexBuffer 

  ; Read and store vertices position, normals, uv coords
  For i = 1 To nbVert
    Read.f x
    Read.f y
    Read.f z
    Read.f nx
    Read.f ny
    Read.f nz
    Read.f u
    Read.f v
  
    *PtrV\px = x * sizex
    *PtrV\py = y * sizey
    *PtrV\pz = z * sizez
    
    *PtrV\nx = nx 
    *PtrV\ny = ny
    *PtrV\nz = nz 
    *PtrV\couleur = Color 
    *PtrV\u = uorigin + (u * uscale)
    *PtrV\v = vorigin + (v * vscale)
    *PtrV + SizeOf(vertex_struct) 
  Next i    


  ; Allocate the needed memory for faces
  *triangleBuffer=AllocateMemory(SizeOf(triangle_struct)*nbTri) 
  *PtrF=*triangleBuffer 
  
  ;Read and store faces infos
  For i=1 To nbTri 
    Read.w v1
    Read.w v2
    Read.w v3 
     
    *PtrF\f1=v1  
    *PtrF\f2=v2 
    *PtrF\f3=v3 
    *PtrF + SizeOf(triangle_struct) 
  Next i 
     
  ; Create mesh from stored infos
  newmesh = CreateMesh(#PB_Any,nx)
  If IsMesh(newmesh) 
    SetMeshData(newmesh,#PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color,*vertexBuffer,nbVert) 
    SetMeshData(newmesh,#PB_Mesh_Face,*triangleBuffer,nbTri) 
    ; and don't forget to free memory
    FreeMemory(*vertexBuffer)
    FreeMemory(*triangleBuffer)
    ProcedureReturn newmesh 
  Else 
    ; even if "createMesh" has failed
    FreeMemory(*vertexBuffer)
    FreeMemory(*triangleBuffer)
    ProcedureReturn -1    
  EndIf 
    
EndProcedure


;- --- Main ---

;- Materials
Add3DArchive(".",#PB_3DArchive_FileSystem)

; Base texture
CreateImage(0,32,32)
StartDrawing(ImageOutput(0))
Box(0, 0, ImageWidth(0), ImageHeight(0), $FFFFFF)
For i=1 To 5
  Circle(Random(ImageWidth(0)),Random(ImageHeight(0)),Random(ImageHeight(0)/6),$DDDDDD)
Next i
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")


; For left eye
CreateMaterial(1,TextureID(0))
MaterialAmbientColor(1, #LEFTEYECOLOR)
MaterialBlendingMode(1, #PB_Material_Add)

; For right eye
CreateMaterial(2,TextureID(0))
MaterialAmbientColor(2, #RIGHTEYECOLOR)
MaterialBlendingMode(2, #PB_Material_Add)

;- Entities
;Create and locate the objects
For i=0 To #NBOBJ-1

  obj(i)\nummesh = createCube(15+Random(10),15+Random(10),15+Random(10))
  
  obj(i)\numentity1 = CreateEntity(#PB_Any,MeshID(obj(i)\nummesh),MaterialID(1))
  obj(i)\numentity2 = CreateEntity(#PB_Any,MeshID(obj(i)\nummesh),MaterialID(2))

  ; Initial position
  obj(i)\x=Random(60)-30
  obj(i)\y=Random(60)-30
  obj(i)\z=Random(100)-50

  ; Initial movement
  obj(i)\xd=(Random(10)-5 ) / 10.0
  obj(i)\yd=(Random(10)-5 ) / 10.0
  obj(i)\zd=(Random(10)-5 ) / 10.0

  ; Spin
  obj(i)\xspin=Random(20)/10
  obj(i)\yspin=Random(20)/10
  obj(i)\zspin=Random(20)/10

Next i

;- Camera 
CreateCamera(#Camera, 0, 0 , 100 , 100) 
xcam=0:ycam=0:zcam=-#CAMERADIST

;- Light 
AmbientColor($666666) 
CreateLight(0,$EEEEEE,200,300,0) 


;- Main loop
Repeat 
  If fullscreen = 0 
    While WindowEvent() : Wend 
  EndIf
  ExamineKeyboard() 
  
;   cameraAngle+0.01
;   If cameraAngle > #PI
;     cameraAngle = -#PI
;   EndIf
;   xcam = #CAMERADIST * Cos(cameraAngle)
;   zcam = #CAMERADIST * Sin(cameraAngle)
  CameraLocate(#CAMERA,xcam,ycam,zcam)
  CameraLookAt(#CAMERA,0,0,0)
  
  ; Move objects
  For i=0 To #NBOBJ-1
  
    obj(i)\x+obj(i)\xd 
    obj(i)\y+obj(i)\yd 
    obj(i)\z+obj(i)\zd

    If obj(i)\x < #CAMERADIST/-2 Or obj(i)\x > #CAMERADIST/2
      obj(i)\xd=-obj(i)\xd
    EndIf
    If  obj(i)\y < #CAMERADIST/-2 Or obj(i)\y > #CAMERADIST/2
      obj(i)\yd=-obj(i)\yd
    EndIf
    If obj(i)\z < #CAMERADIST/-2 Or obj(i)\z > #CAMERADIST/2
      obj(i)\zd=-obj(i)\zd
    EndIf
  
    ;set object To new calculated position
    dist = DISTANCE(xcam,ycam,zcam,obj(i)\x,obj(i)\y,obj(i)\z) - #CAMERADIST
    EntityLocate(obj(i)\numentity2, obj(i)\x - dist*#SEPARATION,obj(i)\y,obj(i)\z)
    EntityLocate(obj(i)\numentity1, obj(i)\x + dist*#SEPARATION,obj(i)\y,obj(i)\z)
  
    ;make object spin every direction
    RotateEntity(obj(i)\numentity1, obj(i)\xspin, obj(i)\yspin, obj(i)\zspin,#PB_Relative )
    RotateEntity(obj(i)\numentity2, obj(i)\xspin, obj(i)\yspin, obj(i)\zspin,#PB_Relative )
  
  Next i

  ; Render
  RenderWorld()
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape) 
End


;- Datas
DataSection

cube:
; Nb sommets / Nb faces
  Data.w 24,12
  
; Vertices: pos / normals / uv
cubeVert:
  Data.f -0.5,0.5,-0.5
  Data.f 0,1,0
  Data.f 0,0
  Data.f 0.5,0.5,-0.5
  Data.f 0,1,0
  Data.f 0,1
  Data.f 0.5,0.5,0.5
  Data.f 0,1,0
  Data.f 1,1
  Data.f -0.5,0.5,0.5
  Data.f 0,1,0
  Data.f 1,0
  Data.f -0.5,-0.5,0.5
  Data.f 0,-1,0
  Data.f 0,0
  Data.f 0.5,-0.5,0.5
  Data.f 0,-1,0
  Data.f 0,1
  Data.f 0.5,-0.5,-0.5
  Data.f 0,-1,0
  Data.f 1,1
  Data.f -0.5,-0.5,-0.5
  Data.f 0,-1,0
  Data.f 1,0
  Data.f -0.5,0.5,0.5
  Data.f 0,0,1
  Data.f 0,0
  Data.f 0.5,0.5,0.5
  Data.f 0,0,1
  Data.f 0,1
  Data.f 0.5,-0.5,0.5
  Data.f 0,0,1
  Data.f 1,1
  Data.f -0.5,-0.5,0.5
  Data.f 0,0,1
  Data.f 1,0
  Data.f 0.5,0.5,-0.5
  Data.f 0,0,-1
  Data.f 0,0
  Data.f -0.5,0.5,-0.5
  Data.f 0,0,-1
  Data.f 0,1
  Data.f -0.5,-0.5,-0.5
  Data.f 0,0,-1
  Data.f 1,1
  Data.f 0.5,-0.5,-0.5
  Data.f 0,0,-1
  Data.f 1,0
  Data.f -0.5,0.5,-0.5
  Data.f -1,0,0
  Data.f 0,0
  Data.f -0.5,0.5,0.5
  Data.f -1,0,0
  Data.f 0,1
  Data.f -0.5,-0.5,0.5
  Data.f -1,0,0
  Data.f 1,1
  Data.f -0.5,-0.5,-0.5
  Data.f -1,0,0
  Data.f 1,0
  Data.f 0.5,0.5,0.5
  Data.f 1,0,0
  Data.f 0,0
  Data.f 0.5,0.5,-0.5
  Data.f 1,0,0
  Data.f 0,1
  Data.f 0.5,-0.5,-0.5
  Data.f 1,0,0
  Data.f 1,1
  Data.f 0.5,-0.5,0.5
  Data.f 1,0,0
  Data.f 1,0

; Faces
cubeTri:
  Data.w 2,1,0
  Data.w 0,3,2
  Data.w 6,5,4
  Data.w 4,7,6
  Data.w 10,9,8
  Data.w 8,11,10
  Data.w 14,13,12
  Data.w 12,15,14
  Data.w 18,17,16
  Data.w 16,19,18
  Data.w 22,21,20
  Data.w 20,23,22

EndDataSection

Re: Anaglyphes

Publié : jeu. 04/mars/2010 14:48
par kelebrindae
Tiens, Dobro, si tu as les lunettes à portée de main, pourrais-tu me dire si mon code fonctionne?
(Je n'ai pas encore retrouvé les miennes)

Re: Anaglyphes

Publié : jeu. 04/mars/2010 15:43
par Backup
je n'ai pas regardé ton code de pres , mais avec les lunettes , ben ça le fait pas ...

pour l'explication du relief il y a 2 methodes

1 - on génère grâce a 2 cameras (3D) espacé de l'écart des yeux
et on film(ou montre) la même scene , les 2 cameras ayant une vue differente du fait de l'écart .. , ensuite on agglomère les 2 vues en une seule , en prenant seulement la composant rouge de l'image de gauche , et en supprimant cette composante de l'image de droite , on reconstruit donc une image, ayant R de la gauche+ V-B de la droite

2 - une solution existe d'utiliser une seule camera , mais en dédiant une image sur 2
a la vue de droite , et une image sur 2 a la vue de gauche
avec le meme systeme de "recombinaison " le relief se voit alors seulement lorsqu'il y a mouvement .... c'est un pseudo relief , puisqu'on compte sur la possibilité que l'image suivante montre un décalage dans la position des objets pour generer le relief ...


le mieux etant la technique numero 1 ! :)

je ne sais pas ce que tu as fait , je vais essayer de regarder ça ...


ps : ça peut pas marcher tu ne creer qu'une seule camera .... :?

c'est plus simple que ça !

tu cree 2 cameras

tu anime 1 seul cube

tu recupere les 2 images de tes 2 cameras
et tu recombine l'image finale en utilisant la technique expliqué ci dessus

R gauche +VB droite :)

Re: Anaglyphes

Publié : jeu. 04/mars/2010 16:06
par kelebrindae
Désolé: effectivement le code ne marchait pas => je bougeais la caméra sur les axes X,Z mais je ne décalais les cubes rouges/bleus que sur l'axe X...
J'ai corrigé le code dans le premier post. Éventuellement, si tu veux bien re-jeter un oeil...

Quant à tes explications: oui, la méthode que tu indiques
tu crées 2 cameras.
tu animes 1 seul cube.
tu récupères les 2 images de tes 2 cameras et tu recombine l'image finale en utilisant la technique expliqué ci dessus
était celle que j'avais retenue à l'origine, mais mon problème, c'est que je n'arrive pas à récupérer les images des caméras...
=> "GrabSprite" ou "GrabImage" ne renvoyaient rien...

Re: Anaglyphes

Publié : jeu. 04/mars/2010 16:51
par Backup
désolé , ton code ne change rien , le relief n'y est pas !

je pense que ta methode ne peux pas marcher !

c'est pas en décalant les objets que tu vas creer du relief !

c'est en décalant le point de vue !

il te faut 2 points de vue ( 2 cameras ) , fait toi aider par Tmyke pour la récuperation des images des cam , j'ai laissé tombé la 3d lorsque 3Dream a ete arrété ....

Re: Anaglyphes

Publié : jeu. 04/mars/2010 17:00
par kelebrindae
mmm... Ok, retour à la planche à dessin, donc. Je vais déjà retrouver mes lunettes bleu/rouge, ça me permettra de tester moi-même plutôt que de coder à l'aveuglette...

Merci de ton aide! :)

Re: Anaglyphes

Publié : jeu. 04/mars/2010 17:19
par cederavic
Le system est un poil plus complex enfait...
Il faut une image de la composante rouge de la camera 1 et deux images de la composante verte et bleue de la camera 2 pour genere une 4eme image avec les 3 composante. J'avais commencé a m'interesser au truc aussi, mais pour de la 3D temps reelle avec les fonctions de dessins de pure c'est beaucoup trop lent... Le mieu serait de passer par des shader (ou alors travailler avec les fonctions de pure mais en tres basse resolution)

Re: Anaglyphes

Publié : jeu. 04/mars/2010 18:04
par cederavic
Je parlais pour le cas d'un traitement en 3D Temps reelle mais tu as raison, deux images suffisent (une rouge et une cyan). J'etais partir sur 3 images pour le cas ou les lunettes etaient inversée ou de couleur differente (j'ai des verte / magenta moi). Parcontre t'essaira de traiter 45 images en 1280x1024 par secondes a coup de rapid_point + rapid_plot, tu va etre déçus :P

Re: Anaglyphes

Publié : jeu. 04/mars/2010 18:14
par Backup
oui pour la vitesse , je sais :lol:

par contre il existe 3 normes pour les anaglyphes
pour info le rouge est toujours a gauche !

le rouge / bleu , le plus commun
le rouge / vert (cyan)
(j'ai les 2 modèles de lunettes chez moi)
un model polarisé ( pour la TV ) a base de Jaune

pour les anaglyphes noir/blanc on recupere que le Rouge gauche et le Bleu droit et on recombine

pour les anaglyphes couleurs
on recupere le Rouge gauche et le vert+bleu droit ! :)

Re: Anaglyphes

Publié : jeu. 04/mars/2010 23:06
par Ar-S
Savez vous quelle technique est maintenant utilisé au cinoche pour les films 3D ?
Par exemple, Avatar que j'ai vu au cinoche en 3D apparaissait "floue", comme si on avait appliqué un Blur à l'image si on enlevait les lunettes.

Re: Anaglyphes

Publié : ven. 05/mars/2010 9:35
par kelebrindae
@Ar-S:
Je crois qu'au ciné, c'est la technique de la polarisation qui est utilisée: au lieu de filtrer les images gauche/droite avec des verres rouge/bleu, on les filtre avec des verres polarisés; ça permet de préserver les couleurs de l'image. Et si l'image apparaît floue sans lunettes, c'est que tu vois deux images légèrement différentes à la fois.
(mais 'faut reconnaître que je parle un peu de trucs que je ne maîtrise pas vraiment, là)

@Dobro:
Je crois que tu as raison: mon code ne peut pas marcher. J'ai retrouvé mes lunettes "créature du lagon noir" hier soir, et je crois que j'ai un peu mieux compris.
=> Au lieu d'avoir deux points de vue sur un seul objet, j'avais un seul point de vue sur deux objets. Même en admettant que le décalage était correctement calculé en fonction de la distance (ce qui n'était probablement pas le cas), le fait que les objets rouge/bleu n'étaient pas exactement à la même position engendre des problèmes de perspective suffisant pour brouiller la perception de relief. Bref: j'avais tout faux.

Il reste donc deux pistes:
- un shader, qui ferait deux rendus différents de la scène et qui les combineraient ensuite à l'écran. Mais bon, avec PB pour l'instant, les shaders c'est pas évident... :?
- la technique "deux caméras -> récup' de l'image -> combinaison à la main". Le problème, c'est que d'après ce que j'ai vu, on ne peut plus récupérer de copie de l'écran en v4.40... :( Peut-être avec N3xt-D; je vais poser la question dans un autre thread, au cas où.

Pour le shader, j'ai trouvé ça sur le forum de Darkbasic: un shader écrit par Green Gandalf (la pointure du shader sous DB) qui a l'air de bien marcher.
Mais je ne sais pas si PB pourrait l'intégrer avec Parse3Dscript, car je suppose qu'il faut lui passer la position de la caméra... Djes pourrait sans doute en dire plus sur le sujet.
Lien: http://forum.thegamecreators.com/?m=for ... 149036&b=1
Exemple:
Image
Code du shader:

Code : Tout sélectionner

// Simple 3D shader
// Created 15 April 2009, edited 16 April 2009.

float4x4 wvp   : WorldViewProjection;
float4x4 wv    : WorldView;
float4x4 proj  : Projection;

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(In.pos, wv) - camOffset;
  // convert to screen coords
  Out.pos = mul(vPos, proj);
  Out.UV = In.UV;
  return Out;
}

VSOutput rightVShader(VSInput In, VSOutput Out)
{ // convert to camera coords and shift to right
  float4 vPos = mul(In.pos, wv) + camOffset;
  // convert to screen coords
  Out.pos = mul(vPos, proj);
  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;
  }
}

Re: Anaglyphes

Publié : ven. 05/mars/2010 11:43
par Backup
pour la version 4.41( et grabsprite() ) faudrai que tu fasse un petit exemple pour Fred
pour qu'il puisse voir facilement si c'est un bug ou pas...


le shader marche bien par contre :) , mais je n'y connais rien en shader :lol:

Re: Anaglyphes

Publié : ven. 05/mars/2010 17:33
par tmyke
Salut kelebrindae.

Qui dit DB, dit je pense DiretcX, donc HLSL.
Le passage des données entre ton programme et le GPU peut être programmé
à travers ton script material.

Par exemple, pour passer le paramètre wvp, il faut écrire un truc du genre
dans la définition de ton HLSL dans le fichier material:

Code : Tout sélectionner

vertex_program Anaglyphes_vs hlsl
{
	source Anaglyphes.hlsl
	entry_point leftVShader
	target vs_1_1

	default_params
	{
		param_named_auto wvp  worldviewproj_matrix
		param_named_auto wv   worldview_matrix
		param_named_auto proj projection_matrix
	}
}
Après, dans chaque passe, tu peux aussi programmer un preset de certaines variables sur ton shader, genre:

Code : Tout sélectionner

pass
{
	vertex_program_ref test_vs
	{
		param_named float4 leftColour 0.0 0.1 1.0 1.0
	}
...
Voilà, si cela peut éclairer ta lanterne....

Re: Anaglyphes

Publié : ven. 05/mars/2010 18:11
par venom
Bonjour,
peut être rien a voir mais regarder cette effet sur image :

Image

apparemment en bougeant une image très vite ça donne un effet 3d.
désolé si je ne suis pas dans le contexte :D






@++

Re: Anaglyphes

Publié : ven. 05/mars/2010 18:29
par Backup
venom a écrit :Bonjour,
peut être rien a voir
si t'es dans le contexte ;)
apparemment en bougeant une image très vite ça donne un effet
la tu te trompe , dans ton anim , il n'y a pas qu'une image !!

mais bien au moins 2 , puisque prise avec un angle different , c'est d'ailleurs cela qui donne l'illusion du relief :)

cette technique est connu , attends, je te cherche un exemple plus parlant ....