Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 17:00

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Erster Shaderversuch und schon probs
BeitragVerfasst: Fr Aug 06, 2004 22:32 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So,

nachdem ganzen shader gelaber hab ich mir gedacht ich fang halt mal mit an.
Damit ich das ganze raff, erstma Vertex Programme.

Hab mein kleines 3D gerüst (www.radical3d.de) welches PerPixel Lighting mit Diffusem Bumpmapping und Stencil Shadow Volumes realisiert umgebaut auf Vertex Shader.
Besser gesagt, ich bin noch dabei und es gibt da auch schon probleme:

Das Vertex Program für den Diffusen Bump Pass steht:

Code:
  1.  
  2. !!ARBvp1.0 OPTION ARB_position_invariant;
  3.  
  4. # Diffuse Vertex Program
  5. # **********************
  6. # Attribute:
  7. #   0 = Licht Position
  8. #   1 = Normal
  9. #   2 = Tangent
  10. #   3 = BiNormal
  11.  
  12. # Konstanten
  13. PARAM cLightPos = program.local[1];
  14.  
  15. # Attribute
  16. ATTRIB iNormal = vertex.attrib[1];
  17. ATTRIB iTangent = vertex.attrib[2];
  18. ATTRIB iBiNormal = vertex.attrib[3];
  19.  
  20. OUTPUT oTexcoord0 = result.texcoord[0];
  21. OUTPUT oTexcoord1 = result.texcoord[1];
  22.  
  23. # Temporäre Variablen
  24. TEMP lightvec, outlight;
  25.  
  26. # Licht Vektor berechnen
  27. SUB lightvec, cLightPos, vertex.position;
  28. DP3 outlight.x, lightvec, iBiNormal;
  29. DP3 outlight.y, lightvec, iTangent;
  30. DP3 outlight.z, lightvec, iNormal;
  31.  
  32. # Farbwerte variieren
  33. MOV result.color, vertex.color;
  34.  
  35. # Texturkoordinaten weitergeben
  36. MOV oTexcoord0, vertex.texcoord[0];
  37. MOV oTexcoord1, outlight;
  38.  
  39. END
  40.  


Nun wollte ich den ganz primitiven pass für Light Attenuation auch in nen Vertex Shader packen, aber:

Das ganze sieht so im normalen OpenGL aus:

Rendern für ein Vertex:

Code:
  1.  
  2. procedure TR3DLight.processLightIntensityVertex(const _Vertex : TR3DVector);
  3. //var
  4. //  texCoords   : TR3DVector;
  5. //  versuborig  : TR3DVector;
  6. begin
  7.   // Texture Koordinaten berechnen für Lightmap
  8.   //versuborig := r3d_VectorSub(_Vertex, Position);
  9.   //texCoords := r3d_VectorDiv(versuborig, Radius * 2.0);
  10.   //texCoords.Add(0.5);
  11.  
  12.   //glMultiTexCoord2fARB(GL_TEXTURE0_ARB, texCoords.x, texCoords.y);
  13.   //glMultiTexCoord2fARB(GL_TEXTURE1_ARB, texCoords.z, 0.5);
  14.   glVertex3fv(@_Vertex);
  15. end;
  16.  


Das was ausgeklammert ist, will ich in dem Light Intesity Vertex Shader einbauen welches noch so aussieht:

Code:
  1.  
  2. !!ARBvp1.0 OPTION ARB_position_invariant;
  3.  
  4. # Light Intensity Vertex Program
  5. # ******************************
  6. # Lokale:
  7. #   0 = Licht Position
  8. #   1 = Radius
  9.  
  10. # Konstanten
  11. PARAM cHalf = { 0.5 };
  12. PARAM cLightPos = program.local[1];
  13. PARAM cLightRadius = program.local[2];
  14.  
  15. OUTPUT oTexcoord0 = result.texcoord[0];
  16. OUTPUT oTexcoord1 = result.texcoord[1];
  17.  
  18. # Temporäre Variablen
  19. TEMP vpsub, texcoords;
  20.  
  21. # Light Attenuation berechnen
  22. SUB vpsub, vertex.position, cLightPos;
  23.  
  24. # texcoords = vpsub / Radius * 2
  25.  
  26. ADD texcoords, texcoords, cHalf;
  27.  
  28. # Texturkoordinaten weitergeben
  29. #MOV oTexcoord0.s, texcoords.x;
  30. #MOV oTexcoord0.t, texcoords.y;
  31. #MOV oTexcoord1.s, texcoords.z;
  32. #MOV oTexcoord1.t, cHalf;
  33.  
  34. # Farbwerte variieren
  35. MOV result.color, vertex.color;
  36.  
  37. END
  38.  


Nun kommen aber die probs, sobald ich das so starte, bekomm ich erstmal fehler im vertex program.


MOV oTexcoord0.s, texcoords.x;
MOV oTexcoord0.t, texcoords.y;
MOV oTexcoord1.s, texcoords.z;
MOV oTexcoord1.t, cHalf;


das gefällt ihm schon nicht, ich muss aber die texcoordinaten so binden:

glMultiTexCoord2fARB(GL_TEXTURE0_ARB, texCoords.x, texCoords.y);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, texCoords.z, 0.5);

und noch dazu hab ich mal kein plan wie ich:

texcoords = vpsub / Radius * 2

als Vertex Program Operationen machen soll, es gibt ja kein Befehl für einfaches Dividieren oder irr ich mich ?

Hat wer ne ahnung wie ich das am besten lösen kann ?

Thx im voraus,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 07, 2004 08:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Da sind auch ein paar Schnitzer drin

Erst mal habe ich mich an deinen Kommentaren orientiert, und etwas Ähnliches in fxPascal nachgebastelt - das Ergebnis sieht dann so aus:

Code:
  1. {$regcount+}{$optimize+}{$lifetime-}
  2. program VertexProgram1;
  3. uses ARB_vertex_program, ARB_position_invariant;
  4.  
  5. param
  6.   cLightPos, cLightRadius: vec4;
  7. varying
  8.   otexcoord0, otexcoord1: vec4;
  9. var
  10.   vpsub, texcoords: vec4;
  11.  
  12. begin
  13.   vpsub := vertex.position - cLightPos;
  14.   texcoords := (vpsub / cLightRadius.x) * 0.5;  // cHalf ist laut deinem Programm einfach der Wert 0.5, ich lasse es derweil mal so
  15.  
  16.   oTexCoord0.x := texcoords.x;
  17.   oTexCoord0.y := texcoords.y;
  18.   oTexCoord1.x := texcoords.z;
  19.   oTexCoord1.y := 0.5;
  20.  
  21.   result.color := vertex.color;
  22. end.


und generiert folgenden Code

Code:
  1. !!ARBvp1.0
  2. OPTION ARB_position_invariant;
  3. OUTPUT otexcoord0=result.texcoord[0];
  4. OUTPUT otexcoord1=result.texcoord[1];
  5. PARAM cLightPos=program.local[0];
  6. PARAM cLightRadius=program.local[1];
  7. TEMP vpsub;
  8. TEMP texcoords;
  9. TEMP temp0;
  10. SUB vpsub,vertex.position,cLightPos;
  11. RCP temp0,cLightRadius.x;
  12. MUL temp0,temp0,vpsub;
  13. MUL texcoords,temp0,{0.5,0.5,0.5,0.5}.w;
  14. MOV otexcoord0.x,texcoords.x;
  15. MOV otexcoord0.y,texcoords.y;
  16. MOV otexcoord1.x,texcoords.z;
  17. MOV otexcoord1.y,{0.5,0.5,0.5,0.5}.w;
  18. MOV result.color,vertex.color;
  19. END


was in meinen Augen sehr viel einfacher ist, als direkt den "Assembler" zu verwenden - man könnte ja später händisch nachoptimieren (die Programme sind ja recht kurz), wenn fxPascal dazu Gelegenheit gäbe :).

Was mir an deinem Code auffällt:

* du definierst die Konstante cHalf als zu übergebenen Programmparameter?? Wahrscheinlich stimmt das Programm ohnehin nicht, als du mit cHalf wahrscheinlich nicht den Wert 0.5 repräsentieren möchtest, dann solltest du aber auch nicht fix den Wert zuweisen - allerdings geht es zur Zeit ja eher um Syntax und Semantik, wenn dein Programm erst mal läuft wirst du es schon selber so hintunen, dass es das macht, was du möchtest :)

* vergleiche mal Absicht und Realisierung ganz genau
# texcoords = vpsub / Radius * 2
ADD texcoords, texcoords, cHalf;

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 07, 2004 11:31 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ah ok, hätte es gleich mit fxPascal machen sollen O_o

Oh da haste was mis verstanden, so noobig bin ich nu au wida net *g*

# texcoords = vpsub / Radius * 2

ADD texcoords, texcoords, cHalf;

Das Add kommt for dem vpsub / radius * 2 °_° und bezieht sich auf: texCoords.Add(0.5);

Aber ich danke mal, werd das dann mit dem fxpascal machen ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 16 Queries | GZIP : On ]