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

Aktuelle Zeit: Fr Apr 19, 2024 00:59

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 19, 2003 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Für meine neue Engine programmiere ich als Nebenprojekt gerade einen Pascal Compiler, der Pasal Quelltext zu OpenGL Vertex und Pixel Shadern compiliert. Die Idee ist nicht nur Cg,glslang und HLSL sondern auch Pascal als Shading Language zu haben. Der Compiler ist modular aufgebaut und erzeugt erst einen Zwischencode, der dann auf die jeweilige Extension wie ARB_VERTEX_PROGRAM,ARB_FRAGMENT_PROGRAM,Register Combiner oder ARB_TEXTURE_ENV umgesetzt wird. Momentan bin ich allerdings erst bei ARB_VERTEX_PROGRAM.
Der Compiler optimiert, indem fertige Teilausdrücke zusammengefaßt werden, Zuweisungen ersetzt werden und Variablen, deren Wert für den weiteren Programablauf unwichtig ist, wiederverwendet werden.
Es gibt als Datentyp single,vector und vector3. Außerdem gib es auch Arrays, aber nur als Konstante.
Bis jetzt gibt es die arihtmetischen Operatoren und noch einige zusätzliche definierte Funktionen wie vec_cross,vec_dot,vec_dist., usw..
Es gibt je nach benutzter Extension gibt es globale Variablen.
Diese Globalen Variablen entsprechen OpenGL Eigenschaften.
state ist z.B. ein Record der den aktuellen OpenGL State enthält.
mvp ist dann ein Array von Vectoren, das die Modelview Matrix*Projection Matrix beinhaltet.
Result ist der endgültige Vertex, wie er an den Pixel Shader weitergeleitet wird und vertex ist der Vertex der aus dem Vertex Array gelesen oder über die glvertex Befehle erzeugt wird.
Diese Konstanten hängen von der Extension ab, die gerade benutzt wird.
Die ARB_VERTEX_PROGRAM Extension bietet z.B. die gleichen Konstanten in einem Vertex Program an. Das heißt aber nicht, das hier einfach nur der Name kopiert wird, sondern diese Variablen sind extra definiert.

Der Compiler ist bei weitem noch nicht fertig und daher werden noch viele Funktionen,Operatoren und Anweisungen hinzukommen.

Ein sehr einfaches Programm sieht z.B. so aus:
Die letzte Zuweisung kann man sich eigentlich sparen, aber hier soll eben auch die Benutzung von lokalen Variablen dargestellt werden.

Code:
  1.  
  2. program Test;
  3. uses arb_vertex_program;
  4. const
  5.  mvp:array[0..3] of vector=state.matrix.mvp;
  6. var
  7.  pos:vector;
  8. begin
  9. pos:=vec_matrixmult(vertex.position,mvp[
  10. 0]);
  11. result.position:=pos;
  12. end.


Man kann auch die with Anweisung und den dot Operator benutzen.
Code:
  1.  
  2. program Test;
  3. uses arb_vertex_program;
  4. var
  5.  pos:vector;
  6. begin
  7. with result do
  8. with state.matrix do
  9. begin
  10. position.x:=vertex.position dot mvp[0];
  11. position.y:=vertex.position dot mvp[1];
  12. position.z:=vertex.position dot mvp[2];
  13. position.w:=vertex.position dot mvp[3];
  14. end;
  15.  
  16. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 22, 2003 12:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Da es vermutlich nicht mehr viele neue Versionen von den ARB_???_PROGRAM Extensions geben wird, wenn OpenGL 2.0 erstmal für alle Grafikkarten verfügbar ist, lohnt es sich nicht langfristig solchen Code zu erzeugen. Stattdessen wird fxPascal ein Konverter von Pascal nach glslang, der in OpenGL eingebauten Shader Sprache. Dabei wird das Program korrekt geparst und analysiert und nicht einfach mit Suchen&Ersetzen gearbeitet, weil man sonst nicht korrekt die Fehler im Pascal Syntax erkennen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 30, 2003 18:33 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Beitrag von Lars aus technischen Gründen von mir gepostet:

Der Konverter von fxPascal nach der OpenGL Shading Language ist schon sei längerem fertig, aber es gibt ja noch keine Treiber um das Program ausführlich zu testen.

Die Extensions ARB_vertex_program und ARB_fragment_program sind auch weiterhin nützlich und deshalb habe ich eine zusätzliche Sprache entwickelt, die direkt auf diesem Extensions aufsetzt und an Pascal angelehnt ist. Es gibt die zwei Klassen TFragmentProgram und TVertexProgram, die für die jeweilige Extension übersetzen und auch optimieren. Der Quelltext wird als Stream im Constructor übergeben und bei Fehlern wird eine Exception ausgelöst. Das ARB Program kann man dann aus der Eigentschaft Source auslesen und mit der Funktion GetSymbolOffset kann man die Position einer Variable abfragen.

Alle Programme bestehen aus optionalen Deklarationsblöcken und einem anschließenden Begin End Block. Im var Block werden temporäre Variablen deklariert. Im Param Block kann man die Program Parameter definieren und im Varying Block wird die Schnittstelle zwischen Vertex und Fragment Program festgelegt.

Beispiel:

Code:
  1.  
  2. var
  3.  a,b,c;
  4. param
  5.  param1,params[10];
  6. varying
  7.  texcoord;


Es gibt keine speziellen Datentypen, weil alles Vektoren sind. Im Param Block kann man aber Arrays definieren, indem man die Anzahl der Elemente in Klammern hinter den Bezeichner schreibt.
Der Begin End Block besteht aus einer Reihe von Anweisungen. Es gibt die Zuweisung mit ":=", with, if then else und discard;
Discard ist nur in Fragmentprogrammen erlaubt und sorgt dafür, daß dieses Fragment nicht gezeichnet wird.
Es können alle Variablen der jeweiligen ARB Erweiterung benutzt werden. Ein ganz einfaches Program wäre z.B.

Code:
  1.  
  2. begin
  3. result.position:=MatrixMult4(state.matrix.mvp,vertex.position);
  4. result.color:=vertex.color;
  5. result.texcoord[0]:=vertex.texcoord[0];
  6. end;


Die folgende Kombination von Vertex und Fragment Program berechnet Tangent Space Blinn Bumpmapping:

Fragment Program:
Code:
  1. param
  2.  LightSize,LightColor,LightSpecular;
  3. varying
  4.  texcoord,LightVec,LightVec2,ViewVec;
  5. var
  6.  color,halfvec,specular,bump;
  7. begin
  8. bump:=NormalMap(3,texcoord);
  9. color:=sat(dot3(bump,normalize(LightVec)))*Texture2D(0,texcoord)*LightColor;
  10. color:=sat(dot3(bump,normalize(LightVec)))*color*LightColor;
  11. halfvec:=normalize(LightVec+ViewVec);
  12. specular:=power(sat(dot(halfvec,bump)),8)*LightSpecular*Texture2D(4,texcoord);
  13. result.color:=(color+specular)*lightatten(LightVec2,LightSize)*bump.w;
  14. end;



Vertex Program
Code:
  1. param
  2.  LightPos,CamPos;
  3. varying
  4.  texcoord,LightVec,LightVec2,ViewVec;
  5. var
  6.  lv;
  7. begin
  8. result.position:=MatrixMult4(state.matrix.mvp,vertex.position);
  9. result.color:=vertex.color;
  10. texcoord:=vertex.attrib[8];
  11. lv:=LightPos-vertex.position;
  12. LightVec:=MatrixMult3(Matrix(vertex.attrib[6],cross(vertex.attrib[6],vertex.attrib[2]),vertex.attrib[2]),lv);
  13. LightVec2:=lv;
  14. lv:=CamPos-vertex.position;
  15. ViewVec:=MatrixMult3(Matrix(vertex.attrib[6],cross(vertex.attrib[6],vertex.attrib[2]),vertex.attrib[2]),lv);
  16. end;


Es gibt folgende Operatoren:
+,-,*,/,
=,<>,<=,<,>,>=
NOT,AND,OR,XOR

In beiden Program Typen sind folgenden Funktionen erlaubt:
min(x,y)
Minimum von x und y

max(x,y)
Maximum von x und y

abs(x)
Absolutwert

cross(x,y)
Kreuzprodukt

dot(x,y)dot3(x,y)
3 Komponenten Skalarprodukt

dot4(x,y)
4 Komponenten Skalarprodukt

doth(x,y)
Homogeneous Dot Product

floor(x)
größter ganzer Integer, der kleiner als x ist

frac(x)
Gibt den Realteil von x zurück.
exp2(x)
Berechnet 2 hoch x

log2(x)
Berechnet den 2er Logarithmus von x

power(x,y)
=x hoch y

normalize(x)
Normalisiert x

length(x)
Berechnet die Länge von x

dist(x,y)
Berechnet die Entfernung von x und y

sqr(x)
=x*x

sqrt(x)
Gibt die Wurzel der ersten Komponente von x zurück

rsqrt(x)
Berechnet den Kehrwert der Wurzel vor der ersten Komponente von x

matrixmult3(matrix,x)
Multipliziert x mit der 3*3 Matrix

matrixmult4(matrix,x)
Multipliziert x mit der 4*4 Matrix

vector(x,y,z,w)
Gibt den Vektor aus den Parametern zurück

matrix(row1,row2,row3[,row4]);
Gibt eine Matrix aus den Paramtervektoren zurück

clamp(x,min,max)
=max(min,min(x,max))

sat(x)
=clamp(x,0,1), wird in Fragment Programmen speziell optimiert

reflect(x,y)
Berechnet den Refletionsvektor von x an y

sin(x)
Berechnet den Sinus von x

cos(x)
Berechnet den Cosinus von x

pi
=PI

lightatten(vec,size)
Berechnet die Lichthelligkeit einer Lichtquelle der Größe size an dem Punkt vec, der relativ zur Lichtquelle angegeben wird.

Die folgenden Funktionen gelten nur für Fragment Programme

Texture1D(tex,coord[,bias]);
Texture2D(tex,coord[,bias]);
Texture3D(tex,coord[,bias]);
TextureCubeMap(tex,coord[,bias]);
TextureRect(tex,coord[,bias]);
Die Funktionen lesen jeweils an der angegebenen Stelle aus der Texture tex. Tex ist die Nummer der Textureeinheit, aus der man lesen möchte.
Optional kann auch noch ein LOD Bias angegeben werde.

Texture1DProj(tex,coord);
Texture2DProj(tex,coord);
Texture3DProj(tex,coord);
TextureCubeMapProj(tex,coord);
TextureRectProj(tex,coord);
Die Funktionen lesen jeweils an der Stelle coord/coord.w aus der Texture tex.

NormalMap(tex,coord[,bias]);
Mit der Funktion NormalMap kann eine Normalmap gelesen und entpackt werden.


Dateianhänge:
passhader.zip [15.72 KiB]
454-mal heruntergeladen

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 30, 2003 21:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Um mal zu zeigen was der Shader Compiler macht habe ich hier mal einige Beispiele aufgelistet:

Quelltext
Code:
  1.  
  2. begin
  3. with state.matrix do
  4.  result.position:=MatrixMult4(mvp,vertex.position);
  5. result.color:=vertex.color;
  6. result.texcoord[0]:=vertex.texcoord[0];
  7. end;
  8.  


Ausgabe als ARB Vertex Program
Code:
  1. !!ARBvp1.0
  2. DP4 result.position.x,state.matrix.mvp.row[0],vertex.position;
  3. DP4 result.position.y,state.matrix.mvp.row[1],vertex.position;
  4. DP4 result.position.z,state.matrix.mvp.row[2],vertex.position;
  5. DP4 result.position.w,state.matrix.mvp.row[3],vertex.position;
  6. MOV result.color,vertex.color;
  7. MOV result.texcoord[0],vertex.texcoord[0];
  8. END
  9.  


Quelltext
Code:
  1. param
  2.  LightPos,CamPos;
  3. varying
  4.  texcoord,LightVec,LightVec2,ViewVec;
  5. var
  6.  lv;
  7. begin
  8. result.position:=MatrixMult4(state.matrix.mvp,vertex.position);
  9. result.color:=vertex.color;
  10. texcoord:=vertex.attrib[8];
  11. lv:=LightPos-vertex.position;
  12. LightVec:=MatrixMult3(Matrix(vertex.attrib[6],cross(vertex.attrib[6],vertex.attrib[2]),vertex.attrib[2]),lv);
  13. LightVec2:=lv;
  14. lv:=CamPos-vertex.position;
  15. ViewVec:=MatrixMult3(Matrix(vertex.attrib[6],cross(vertex.attrib[6],vertex.attrib[2]),vertex.attrib[2]),lv);
  16. end;


Ausgabe als ARB Vertex Program
Code:
  1. !!ARBvp1.0
  2. OUTPUT texcoord=result.texcoord[0];
  3. OUTPUT LightVec=result.texcoord[1];
  4. OUTPUT LightVec2=result.texcoord[2];
  5. OUTPUT ViewVec=result.texcoord[3];
  6. PARAM LightPos=program.local[0];
  7. PARAM CamPos=program.local[1];
  8. TEMP lv;
  9. TEMP temp0;
  10. DP4 result.position.x,state.matrix.mvp.row[0],vertex.position;
  11. DP4 result.position.y,state.matrix.mvp.row[1],vertex.position;
  12. DP4 result.position.z,state.matrix.mvp.row[2],vertex.position;
  13. DP4 result.position.w,state.matrix.mvp.row[3],vertex.position;
  14. MOV result.color,vertex.color;
  15. MOV texcoord,vertex.attrib[8];
  16. SUB lv,LightPos,vertex.position;
  17. XPD temp0,vertex.attrib[6],vertex.attrib[2];
  18. DP3 LightVec.x,vertex.attrib[6],lv;
  19. DP3 LightVec.y,temp0,lv;
  20. DP3 LightVec.z,vertex.attrib[2],lv;
  21. MOV LightVec2,lv;
  22. SUB lv,CamPos,vertex.position;
  23. XPD temp0,vertex.attrib[6],vertex.attrib[2];
  24. DP3 ViewVec.x,vertex.attrib[6],lv;
  25. DP3 ViewVec.y,temp0,lv;
  26. DP3 ViewVec.z,vertex.attrib[2],lv;
  27. END
  28.  


Quelltext für ein einfaches Fragmentprogram:

Code:
  1. begin
  2.  result.color:=Texture2D(0,fragment.texcoord[0]);
  3. end;


Ausgabe als ARB Fragment Program

Code:
  1. !!ARBfp1.0
  2. TEX result.color,fragment.texcoord[0],texture[0],2D;
  3. END


Quelltext für ein Fragmentprogram, daß Basistexture und Lightmap multipliziert:

Code:
  1. begin
  2.  with fragment do
  3.  result.color:=Texture2D(0,texcoord[0])*Texture2D(1,texcoord[0]);
  4. end;


Ausgabe:

Code:
  1. !!ARBfp1.0
  2. TEMP temp0;
  3. TEMP temp1;
  4. TEX temp0,fragment.texcoord[0],texture[0],2D;
  5. TEX temp1,fragment.texcoord[0],texture[1],2D;
  6. MUL result.color,temp0,temp1;
  7. END


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 05, 2003 23:38 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich habe jetzt mal eine neue Version an den Beitrag angehängt. Ich habe Fehler beseitigt und den Quelltext aufgeräumt, die Code Optimierung verbessert, benutzerdefinierte Funktionen mit dem function Schlüsselwort hinzugefügt und ein Tutorial mit ca. 30 Seiten geschrieben.


Dateianhänge:
passhader.zip [83.44 KiB]
447-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 21, 2003 22:48 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich habe die neue Version fertig. Es gibt jetzt die beiden Datentypen vec4 und single, die Code Optimierung wurde verbessert und Fehler wurden beseitigt. Man kann die Constructoren jetzt auch mit einem String als Parameter aufrufen. Es gibt auch Prozeduren und bei den Parametern die entsprechenden Parametertypen wie const,var oder out. Man kann jetzt ebenfalls auch globale Konstanten und konstante Arrays deklarieren. Im Programmierhandbuch werden die neuen Fähigkeiten beschrieben und es ist bei den Beispielen ein Kapitel zu volumetrischem Licht dazugekommen.


Dateianhänge:
fxpascal.zip [100.04 KiB]
453-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich habe jetzt mal wieder eine neue Version fertig. Die Änderungen sind:

1.Programme haben Programkopf und in der uses Klausel die benutzten Extensions möglich sind: ARB_vertex_program,ARB_fragment_program,ARB_position_invariant, ATI_draw_buffers
2.Die Funktion CompileProgram wird für die Kompilierung benutzt und wählt automatisch die richtige Klasse aus. Die Klassen muß man selber nicht mehr verwenden. Man kann alle benutzen Parameter in einer Liste erhalten.
3.For Schleifen: to und downto Variante,Start und Ende muß aber konstant sein, es sind nur integer erlaubt
4.Neuer Datentype Integer für For Schleifen
5.Compiler Befehle
{$ifdef}{$else}{$endif}
{$define}{$undefine}
{$optimize} {$regcount}
6.Bessere Optimierung
-Teilausdrücke werden effizienter ersetzt
-Wahlweise Optimierung auf Länge oder Registerbenutzung des Shaders
-Lebendigkeitsanalyse um minimale Anzahl von benötigten Variablen zu finden
7.Compiler Warnungen und Hinweise
8.Neues Symbol program_env[0..31] für Environment Parameter

Außerdem habe ich das PDF aktualisiert, daß die neue Version und auch die Vorgehensweise des Compilers ausführlich beschreibt.

fxPascal hat die GPL Lizenz und kann auch bei bei sourceforge heruntergeladen werden.
https://sourceforge.net/projects/fxpascal/


Dateianhänge:
fxpascal.zip [121.25 KiB]
439-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 02, 2004 18:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Nach eingier Zeit habe ich nochmal eine neue Version veröffentlicht. Es wurden hauptsächlich Fehler behoben und eine Kommandozeilenversion des Compilers mit Quelltext hinzugefügt.

@Mars: Den Fehler mit dem Parallax Mapping habe ich leider noch nicht gefunden, obwohl ich die beiden Dateien zeilenweise durchgegangen bin.

Die neue Version gibt es bei SourceForge https://sourceforge.net/project/showfiles.php?group_id=93197&package_id=98819&release_id=221003

oder im Anhang dieser Nachricht.


Dateianhänge:
fxpascal_con.jpg
fxpascal_con.jpg [ 134.96 KiB | 8139-mal betrachtet ]
fxpascal.zip [133.08 KiB]
436-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Sonstiges » Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 48 Gäste


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.173s | 19 Queries | GZIP : On ]