Page 1 sur 2

démo - brillance

Publié : jeu. 15/oct./2015 22:10
par Guillot
Image

je viens de comprendre le fonctionnement de la brillance
et j'en suis tout ébloui (ouarf !)
(je sens que je vais en mettre de partout)

pour ce faire:
definir la couleur speculaire de la lumiere

SetLightColor(..., #PB_Light_SpecularColor, couleur)


perso, je comprends pas la réalité physique de ce parametre, ce qui est responsable du reflet, c'est la matiere. (peut etre pour certains effets...)
moi, je pense que ce parametre devrait etre automatiquement definit au moment de la création de la lumiere (avec la meme couleur)
si certain ont un avis eclairé (re ouarf !) sur le sujet, j'attends leur commentaire

ensuite, definir la couleur réfléchie par la matiere et sa diffusion

SetMaterialColor(..., #PB_Material_SpecularColor, couleur)
MaterialShininess(..., diffusion)


plus la valeur de diffusion est faible plus la matiere est mate, plus elle est élevée, plus elle est brillante
Note: une valeur faible donne une reflet global beaucoup plus lumineux. du coup, on est obliger d'ajuster l'intensité de la lumiere réfléchie à la brillance, dommage

j'ai adapté ma demo 'mesh axial' pour vous monter le resultat
c'est bôôôô !

Code : Tout sélectionner

;Mesh Axial, brillance - Pf shadoko - 2015 

EnableExplicit

Global.w ex,ey,dx,dx1,dy,dy1,nb

;###############################################################################
;###############################################################################
;###############################################################################
Structure coo2d
  x.f
  y.f
EndStructure
  
Procedure Bspline(Array pe.coo2d(1), Array PS.coo2d(1),nd.w)
  Protected.f t,tt
  Protected np,i,j,jj,k,c
  Protected Dim m.w(4, 4)
  Protected Dim ttt.f(4)
  np = ArraySize(pe()) 
  Protected Dim PS((np - 2) * nd)
  
  m(0, 0) = -1: m(1, 0) =  3: m(2, 0) = -3: m(3, 0) =  1
  m(0, 1) =  2: m(1, 1) = -5: m(2, 1) =  4: m(3, 1) = -1
  m(0, 2) = -1: m(1, 2) =  0: m(2, 2) =  1: m(3, 2) =  0
  m(0, 3) =  0: m(1, 3) =  2: m(2, 3) =  0: m(3, 3) =  0

  If pe(np - 1)\X = pe(1)\X And pe(np - 1)\Y = pe(1)\Y
    pe(0) = pe(np - 2): pe(np) = pe(2)
  Else 
    pe(0) = pe(1):pe(np) = pe(np - 1)
  EndIf
  
  For jj = 0 To np - 3
    For i = 0 To nd - 1
      t = i / nd
      For j = 0 To 3
        ttt(j) = 0: tt = 0.5
        For k = 3 To 0 Step -1: ttt(j) + tt * m(j, k) : tt * t: Next
        PS(c)\X + ttt(j) * pe(j + jj)\X
        PS(c)\Y + ttt(j) * pe(j + jj)\Y
      Next
      c + 1
    Next
  Next
  PS(c) = pe(np - 1)
EndProcedure

Procedure string2coo2d(Array s.coo2d(1),t.s) ;pas tres élégant !
  Protected Dim a.f(0, 0)
  Protected n
  t="0,0/"+t+"/0,0"
  ParseJSON(0, "[["+ReplaceString(t,"/","],[")+"]]")
  ExtractJSONArray(JSONValue(0), a())
  n=ArraySize(a())
  Dim s.coo2d(n)
  CopyMemory(@a(0,0),@s(0),4*2*(n+1))
EndProcedure

Procedure.f lg2D(x.f,y.f)
  ProcedureReturn Sqr(x.f*x.f+y.f*y.f)
EndProcedure

Procedure CreateAxialMesh(mesh,Array profils.coo2d(1),Array section.coo2d(1))
  Macro profilsJ()
    ar=r
    ah=h
    r=profils(j)\x
    h=profils(j)\y
    v+lg2D(r-ar,h-ah)
  EndMacro
  
  Protected i,j,r.f,h.f,ar.f,ah.f,a.f,v.f,vv.f,n,n1,m
  n=ArraySize(section()):n1=n+1
  m=ArraySize(profils())
  
  r=profils(0)\x:h=profils(0)\y:v=0
  For j=0 To m:profilsJ():Next:vv=v
  
  r=profils(0)\x:h=profils(0)\y:v=0
  CreateMesh(mesh,#PB_Mesh_TriangleList,#PB_Mesh_Dynamic)
  For j=0 To m
    profilsJ()
    For i=0 To n    
      MeshVertexPosition(section(i)\x* r,h,section(i)\y* r)
      MeshVertexTextureCoordinate(i/n,v/vv)
      MeshVertexNormal(0,0,0)
      MeshVertexColor($ffffff)
    Next
  Next
  For j=0 To m-1
  For i=0 To n-1
    MeshFace(i+j*n1,i+(j+1)*n1,(i%n1+1)+j*n1)
    MeshFace((i%n1+1)+(j+1)*n1,(i%n1+1)+j*n1,i+(j+1)*n1)
  Next
  Next
  FinishMesh(1)
  NormalizeMesh(mesh)
  ;UpdateMeshBoundingBox(mesh)
  ;BuildMeshTangents(Mesh)
EndProcedure

Procedure CreateAxialMeshCustom(mesh,ProfilList.s,ProfilSubDiv,sectionList.s,SectionSubDiv)
  Protected Dim profil.coo2d(0)
  Protected Dim profils.coo2d(0)
  string2coo2d(profil(),ProfilList)
  Bspline(profil(),profils(),ProfilSubDiv)
  
  Protected Dim section.coo2d(0)
  Protected Dim sections.coo2d(0)
  string2coo2d(section(),sectionList)
  Bspline(section(),sections(),SectionSubDiv)
  
  CreateAxialMesh(mesh,profils(),sections())
EndProcedure

Procedure CreateAxialMeshCircular(mesh,ProfilList.s,ProfilSubDiv=16 ,cercleSubDiv=16)
  Protected i,a.f
  Protected Dim profil.coo2d(0)
  Protected Dim profils.coo2d(0)
  string2coo2d(profil(),ProfilList)
  Bspline(profil(),profils(),ProfilSubDiv)
  
  Protected Dim section.coo2d(cercleSubDiv)
  For i=0 To cercleSubDiv:a=Radian(360/cercleSubDiv)*i:section(i)\x=Cos(a):section(i)\y=Sin(a):Next
  
  CreateAxialMesh(mesh,profils(),section())
EndProcedure
;###############################################################################
;###############################################################################
;###############################################################################

Procedure degrade(Array pal.l(1),l,c1.l,c2.l)
  Dim pal(l-1)
  CreateImage(0,l,1,32)
  StartDrawing(ImageOutput(0))
  DrawingMode(#PB_2DDrawing_Gradient)
  GradientColor(0.0,c1)
  GradientColor(1.0,c2)
  LinearGradient(0,0,l-1,0)
  Box(0,0,l,1)
  CopyMemory(DrawingBuffer(),@pal(0),l*4)
  StopDrawing()
  FreeImage(0)
EndProcedure

Procedure generematiere(num,dx,dy,c1,c2,type,brillance=$ffffff,transparence=0)
  Protected i,j,y
  Protected Dim pal.l(0):degrade(pal(),256,c1,c2)
  CreateTexture(num,dx,dy)
  StartDrawing(TextureOutput(num))
  Select type
    Case 1; point (assiette /pomme / coupe)
      DrawingMode(#PB_2DDrawing_AllChannels  )
      For j=0 To dy-1:For i=0 To dx-1:Plot(i,j,pal(Random(255))):Next:Next
    Case 2; tissu (boite)
      For i=0 To 2000:Line(Random(dx),0,1,dy,pal(Random(127)+128)):Line(0,Random(dy),dx,1,pal(Random(127))):Next  
    Case 3; brasselet
      For i=-dx To dx:LineXY(i,0,i+dx,dy,pal(Bool(i & 30)*255)):Next  
    Case 4; vase
      For j=0 To dy-1:For i=0 To dx-1:y=((Cos(i*4*#PI/dx)*255)): Plot(i ,j,pal((j*5+y) & 255)):Next:Next  
    Case 5; verre
      Box(0,0,dx,dy,$555555):For j=0 To dy Step 8:Box (0,j,dx,1,$5555ff):Next;:Box (j,0,2,dy,$0000ff)
  EndSelect  
  StopDrawing()
  CreateMaterial(num, TextureID(num))
  If brillance:   SetMaterialColor(num, #PB_Material_SpecularColor, brillance):MaterialShininess(num, 80):EndIf
  If transparence:MaterialBlendingMode(num, #PB_Material_Color):MaterialCullingMode(num,#PB_Material_NoCulling):EndIf
EndProcedure

Procedure scene()
  Protected i,j,k,c,x,y,dx=8,dy=8
    
  ;######################################## cameras 
  CreateCamera(0, 0, 0, 100, 100):MoveCamera(0, 900, 500, 0, #PB_Absolute):CameraLookAt(0, 0, -50, 0):CameraBackColor(0, $333333) 
  CreateCamera(1, 0, 0,100,100):CameraBackColor(1, $333333);  (miroir)
  
  ;######################################## lumieres 
  CreateLight(0,$ffffff, 10000, 5000, 5000):SetLightColor(0, #PB_Light_SpecularColor, $ffffff)
  CreateLight(1,$ffffff, -5000, 5000,10000):SetLightColor(1, #PB_Light_SpecularColor, $ffffff)
  AmbientColor($222222)
  
  ;######################################## textures / matieres 
  CreateRenderTexture(0,CameraID(1),ex,ey)
  CreateMaterial(0, TextureID(0))
  SetMaterialColor(0,#PB_Material_DiffuseColor,$ffffff):MaterialBlendingMode(0,#PB_Material_Color)
  
  generematiere(1,256,256,$aa7722,$ffaa33,1,$444444) :ScaleMaterial(1,0.25*16,0.25*2) 
  generematiere(2,256,256,$aa8844,$ccaa66,1,$444444)
  generematiere(3,128,256,$443300,$222200,1,$888888)
  generematiere(4,64,64,$6666aa,$444488,1,$ffffff,1)
  generematiere(5,256,256,$0000ff,$ffcc22,3)
  generematiere(6,256,256,$88aa55,$ccaa99,4,$888888) :ScaleMaterial(6,0.25,0.25)
  generematiere(7,256,256,0,0,5,$ffffff,1)
  generematiere(8,8,8,$999900,$cc0000,1,$444444)
  generematiere(9,256,256,$ff8800,$88ff88,2,$444444)  :ScaleMaterial(9,0.25,0.25)
  generematiere(100,1,1,$ffffff,$ffffff,1):SetMaterialColor(100,#PB_Material_SelfIlluminationColor,$ffffff);lumiere
   
  ;######################################## mesh/entity
  
  ;vitre
  CreateAxialMeshCircular(1,"500,0/0,0",8,32)
  CreateEntity(1, MeshID(1), MaterialID(0),0,0,0)
  ;table
  CreateAxialMeshCircular(9,"500,0/0,0",16,32)
  CreateEntity(9, MeshID(9), MaterialID(3),0,-1,0)
  ;coupes
  CreateAxialMeshCircular(10,"0,0/50,1/10,20/10,100/55,200/50,200/0,100",4,32)
  CreateEntity(10, MeshID(10), MaterialID(4),0,0,-300)
  CreateEntity(11, MeshID(10), MaterialID(4),200,0,-320)
  ;assiette
  CreateAxialMeshCircular(12,"0,0/80,1/160,46/160,49/156,50/76,5/0,5",1,8)
  CreateEntity(12, MeshID(12), MaterialID(2),250,0,250)
  ;vases
  CreateAxialMeshCircular(13,"0,0/80,1/120,150/80,250/110,300/100,300/75,250/75,20/0,20",8,32)
  CreateEntity(13, MeshID(13), MaterialID(6),-0,0,0)
  ;boite
  CreateAxialMeshCircular(14,"0,0/80,1/110,70/85,140/90,140/90,150/10,160/20,190/0,200",8,4)
  CreateEntity(14, MeshID(14), MaterialID(1),-200,0,-200)
  ;brasselet                              !!!! pour faire un tore, le premier point doit etre similaire au premier !!!!
  CreateAxialMeshCircular(15,"45,15/45,0/55,15/45,30/45,15",4,32)
  CreateEntity(15, MeshID(15), MaterialID(5),400,0,100)
  ;verre
  CreateAxialMeshCircular(16,"0,0/50,1/51,2/60,150/59,152/58,152/57,150/46,6/45,5/0,5",1,32)
  CreateEntity(16, MeshID(16), MaterialID(7),0,0,200)
  CreateEntity(17, MeshID(16), MaterialID(7),-200,0,200)
  ;truc (custom (ici on definit la section))
  CreateAxialMeshCustom(17,"0,0/56,1/62,34/64,40/61,43/58,40/60,34/52,6/0,4",4,"-0.8,0/-1,-1/1,-1/0.8,0/1,1/-1,1/-0.8,0",8)
  CreateEntity(18, MeshID(17), MaterialID(9),300,0,-100)
  ;pommes
  CreateAxialMeshCircular(18,"0,10/20,0/45,30/50,80/20,100/2,90/2,105/0,110",4,32)
  CreateEntity(19, MeshID(18), MaterialID(8),70,10,0)   :AttachEntityObject(12,"",EntityID(19))
  CreateEntity(20, MeshID(18), MaterialID(8),-20,10,-50):AttachEntityObject(12,"",EntityID(20))
  CreateEntity(21, MeshID(18), MaterialID(8),-20,10,50) :AttachEntityObject(12,"",EntityID(21))
  
  For i=9 To 18:AttachEntityObject(1,"",EntityID(i)):Next
  CreateSphere(100,10)
  For i=0 To 1:CreateEntity(100+i,MeshID(100),MaterialID(100)):Next
 EndProcedure

Procedure rendermirror2(entity,mesh,nx.f,ny.f,nz.f,camP,camM)
  Protected c,n,mx,my
  Protected.f xp,yp,zp,dxp,dyp,dzp
  Protected Dim T.PB_MeshVertex(0)
  xp=CameraX(camP):dxp=CameraDirectionX(camP)
  yp=CameraY(camP):dyp=CameraDirectionY(camP)
  zp=CameraZ(camP):dzp=CameraDirectionZ(camP)
  CameraDirection(camM,dxp,-dyp,dzp)
  MoveCamera(camM,xp,-yp,zp,#PB_Absolute)
  mx=CameraViewWidth (camp) ;###################################### marche pas avec la camera 1(RTT),
  my=CameraViewHeight(camp) ;###################################### -> probleme si resolutions differentes
  n=MeshVertexCount(mesh)-1
  GetMeshData(mesh,0,t(),#PB_Mesh_Vertex|#PB_Mesh_UVCoordinate ,0,n)
  For c=0 To n
    With t(c)
      ConvertLocalToWorldPosition(EntityID(entity),\x,\y,\z)
      \u=  CameraProjectionX(1,GetX(), 0,GetZ())/mx
      \v=  CameraProjectionY(1,GetX(), 0,GetZ())/my
    EndWith
  Next
  SetMeshData(mesh,0,t(),#PB_Mesh_Vertex|#PB_Mesh_UVCoordinate,0,MeshVertexCount(mesh)-1)
EndProcedure


Define.f KeyX, KeyY,keyz, MouseX, MouseY,time,v,a,x,y,z,r.l
Define i,j,c,px,py,p,fdf,rot=1
InitEngine3D()   
InitSprite()
InitKeyboard()
InitMouse()
AntialiasingMode(#PB_AntialiasingMode_x4  )
OpenWindow(0, 0, 0, 0,0, " Mesh Axial",#PB_Window_Maximize)
ex=WindowWidth (0,#PB_Window_InnerCoordinate)
ey=WindowHeight(0,#PB_Window_InnerCoordinate)
OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)

;{ menu
Macro DT(t1,t2)
  DrawText(4,p,t1)
  DrawText(40,p,t2)
  p+16
EndMacro
CreateSprite(0,120,184,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_AlphaClip|#PB_2DDrawing_Outlined )
Box(0,0,120,184)
BackColor($0000ff)
dt("Déplacements:","")
dt("[Left]","")
dt("[Right]","")
dt("[Up]","")
dt("[Down]","")
dt("Mouse+wheel","")
dt("","")
dt("Commandes:","")
dt("[F1]","fil de fer")
dt("[F2]","Rotation")
dt("[Esc]","Quitter")
StopDrawing()
;}
scene()
Repeat    
  WindowEvent()  
  ExamineMouse()
  MouseX = -MouseDeltaX() *  0.05
  MouseY = -MouseDeltaY() *  0.05
  ExamineKeyboard()
  keyx=(-Bool(KeyboardPushed(#PB_Key_Left)<>0)+Bool(KeyboardPushed(#PB_Key_Right)<>0))*4
  keyz=(-Bool(KeyboardPushed(#PB_Key_Down)<>0)+Bool(KeyboardPushed(#PB_Key_Up   )<>0))*4+MouseWheel()*50
  RotateCamera(0, MouseY, MouseX, 0, #PB_Relative):MoveCamera  (0, KeyX, keyy, -keyz)  
  If KeyboardReleased(#PB_Key_F1):fdf=1-fdf:If fdf:CameraRenderMode(0,#PB_Camera_Wireframe):Else:CameraRenderMode(0,#PB_Camera_Textured):EndIf:EndIf
  If KeyboardReleased(#PB_Key_F2):rot=1-rot:EndIf
  RotateEntity(1,0,0.2*rot,0,#PB_Relative)
  For i=0 To 1
    y=i*200+300
    x=Cos(a*(i+2))*500
    z=Sin(a*(i+2))*500
    MoveEntity(100+i,x,y,z,0)
    MoveLight(i,x,y,z,0)
    a+0.001
  Next
  rendermirror2(1,1,0,1,0,0,1)
  time+RenderWorld()/200
  DisplayTransparentSprite(0, 8,8,128)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End

Re: démo - brillance

Publié : ven. 16/oct./2015 9:20
par comtois
C'est magnifique :P

Re: démo - brillance

Publié : ven. 16/oct./2015 10:14
par blendman
En fait, si j'ai bien saisi la brillance, c'est la lumière spéculaire des soft 3D, c'est ça ?

Normalement, c'est aussi ce que tu peux gérer via un shader specular.

Re: démo - brillance

Publié : ven. 16/oct./2015 11:08
par Fred
Sacrement futé la generation des meshs ! Belle demo :)

ps: Ogre 1.8 ne supporte pas le Physic Based Rendering, donc je ne pense pas que ce soit lié à une vraie propriété physique de la lumiere ou de la matiere. Ogre 2.1+ le supporte, donc si on le mets a jour, ce genre d'effet sera facilement géré (mais il est toujours en beta, et c'est DX11+).

Re: démo - brillance

Publié : ven. 16/oct./2015 11:10
par Anonyme2
Bon :roll: ,
en 32 ou 64 bit j'ai soit un plantage sans le debugger et si je met le debugger, j'ai une erreur accès mémoire ligne 283

j'ai du louper quelque chose :roll:

Re: démo - brillance

Publié : ven. 16/oct./2015 12:36
par SPH
Denis a écrit :Bon :roll: ,
en 32 ou 64 bit j'ai soit un plantage sans le debugger et si je met le debugger, j'ai une erreur accès mémoire ligne 283

j'ai du louper quelque chose :roll:
+1 :cry: :cry:

Re: démo - brillance

Publié : ven. 16/oct./2015 14:27
par falsam
@Denis, SPH: Si vous êtes sous Windows 7, 8 ou 10, DirectX 9c n'est peut être pas installé.

Pour le vérifier: Utilisez l'utilitaire dxdiag.
Cliquez sur le bouton Démarrer, tapez dxdiag dans la zone de recherche, puis cliquez sur Entrée.

Depuis Windows 7 c'est DirectX 11 qui est installé et Microsoft toujours soucieux du bien être de ses utilisateurs, n'a pas jugé bon d'assurer une rétrocompatibilité avec les anciennes versions de DirectX.
Miscrosoft a écrit :Rendez-vous sur la page Web DirectX End-User Runtime Web Installer et suivez les instructions permettant d’installer DirectX 9, de recevoir les mises à jour vers DirectX 9 et les versions précédentes de DirectX.
Solution si vous êtes sous Directx 11: Installer Directx 9c ou bien exécuter le code de Guillot avec l'option OpenGl dans les paramètres de compilation.
Menu Compilateur => Options du compilateur =>Bibliothéque sous-système : Tapez OpenGl

Re: démo - brillance

Publié : ven. 16/oct./2015 14:44
par comtois
Il y a une dll de directx9 dispo dans le répertoire SDK de PureBasic :
C:\PureBasic\SDK\DirectX9 Redistribuable

Re: démo - brillance

Publié : ven. 16/oct./2015 16:19
par Anonyme2
falsam a écrit :@Denis, SPH: Si vous êtes sous Windows 7, 8 ou 10, DirectX 9c n'est peut être pas installé.
Merci Falsam, c'est DirectX 11


Belle démo en effet

Merci Comtois pour l'info

Re: démo - brillance

Publié : ven. 16/oct./2015 16:41
par Mesa
Sous XP, seul opengl fonctionne.

M.

Re: démo - brillance

Publié : ven. 16/oct./2015 18:24
par Kwai chang caine
Moi sous XP avec 5.40 LTS Beta 8 ça marche pas même avec OPENGL
Ligne 284 StartDrawing(SpriteOutput(0))
Attente du démarrage du programme...
Type d'exécutable: Windows - x86 (32bit)
Exécutable démarré.
[ERREUR] Ligne: 284
[ERREUR] StartDrawing(): La sortie spécifiée est NULL (valeur 0).
Le programme a été arrêté.

Re: démo - brillance

Publié : ven. 16/oct./2015 20:12
par falsam
Kwai chang caine a écrit :Moi sous XP avec 5.40 LTS Beta 8 ça marche pas même avec OPENGL
Depuis il y a eu la Beta 9, la Beta 10 et pour finir la version finale 5.40 LTS. Tu pourrais essayer avec cette dernière. :wink:

Et maintenant que tout le monde sait que tu as un nouveau jouer .... tu peux aussi essayer ce code qui à mon avis fonctionnera à merveille.

Re: démo - brillance

Publié : sam. 17/oct./2015 6:00
par Anonyme2
Kwai chang caine a écrit :Moi sous XP avec 5.40 LTS Beta 8 ça marche pas même avec OPENGL
Ligne 284 StartDrawing(SpriteOutput(0))
Attente du démarrage du programme...
Type d'exécutable: Windows - x86 (32bit)
Exécutable démarré.
[ERREUR] Ligne: 284
[ERREUR] StartDrawing(): La sortie spécifiée est NULL (valeur 0).
Le programme a été arrêté.
Peut-être que tu devrais passer à Windows 95 :mrgreen:

Re: démo - brillance

Publié : sam. 17/oct./2015 10:16
par Kwai chang caine
Depuis il y a eu la Beta 9, la Beta 10 et pour finir la version finale 5.40 LTS. Tu pourrais essayer avec cette dernière.
Je viens de l'installer et ça fait pareil, sous une autre machine XP, donc...ça doit venir d'XP comme dirait "kiloWatson" :wink:
C'est pas grave, je vous fait confiance, ça a l'air superbe...je laisse tomber les fruits..je vais me bouffer un yaourt :mrgreen:
Et maintenant que tout le monde sait que tu as un nouveau jouer
Oui, mais cette fois il est pas dans son carton...mais dans sa valise :lol:
Peut-être que tu devrais passer à Windows 95 :mrgreen:
Qu'il est taquin ce DENIS :lol:
Quoi que des fois ...il me manque :mrgreen:

Re: démo - brillance

Publié : sam. 17/oct./2015 12:36
par Patrick88
marche nickel
pb 5.31 x64 - core i7 - 8 go - gtx 660 - windows 10

aucun paramètre pour le compilateur

je saurais pas dire si y'a directx 9c d'installé

Pat