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

Aktuelle Zeit: Mi Mai 29, 2024 00:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Dez 23, 2009 20:56 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
Ich wollt mir eine Shaderbasierte Engine schreiben und stellt sich mir die Frage, ob ich ein eigenes Vertexformat definieren sollte und damit unflexibel bin wenn andere Vertexformate gebraucht werden, oder es anders löse.
Vielleicht kann mir ja einer helfen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 24, 2009 10:06 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Da die Frage imho vieeeel zu generisch ist, stell ich mal ne Gegenfrage:

Wäre es denn wirklich so viel Aufwand, das Vertexformat nachher wieder zu ändern? Kann ich mir eigentlich nicht vorstellen ;)

Ich würde also erstmal ein eigenes nehmen und wenn es sich nicht vermeiden lässt irgendwann auf ein festes umsteigen.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 24, 2009 10:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich verwende WebGL, was in dieser Hinsicht recht ähnlich zu OpenGL 3 ist. Also bei mir sieht das so aus:

Bei der Definition des Shaders gebe ich neben den Texture-Uniforms auch die Vertexattribute an:
Code:
  1. "myshader.prg" : {
  2.     "vertexShader" : "myshader.vs",
  3.     "fragmentShader" : "myshader.fs",
  4.     "attributes" : ["aPosition", "aNormal", "aTexCoord"],
  5.     "textures" : ["uTexture", "uBumpmap"]
  6. }

Also das Attribute aPosition wird vor dem linken des Shaders auf Index 0 gebunden, aNormal auf Index 1 usw.
Genauso geht es auch mit den Texturen, die Uniform-Variable uTexture wird beim laden des Shaders auf 0 gesetzt, uBumpmap auf 1.

Beim Mesh gebe ich das Format durch eine Ziffernfolge an. Die Größe eines Vertex beträgt 3+3+2=8 Floats. Die ersten 3 floats werden an Index 0 gebunden, die nächsten 3 an Index 1 und dann noch 2 floats an Index 2.
Code:
  1. "mymesh.mesh" : {
  2.     "format" : "332",
  3.     "vertices" : [...],
  4.     "indices" : [...]
  5. }


Der Format-String wird überprüft und in ein Array umgewandelt, beim rendern wird das ganze dann so gesetzt:
Code:
  1. int offset = 0;
  2. int vertexSizeInByte = vertexSize * 4;
  3. for (int i=0; i<format.length; ++i) {
  4.     int attribSize = format[i];
  5.     gl.enableVertexAttribArray(i);
  6.     gl.vertexAttribPointer(i, attribSize, gl.FLOAT, false, vertexSizeInByte, offset);
  7.     offset += attribSize * 4;
  8. }


Das ganze ist sehr flexibel und ausreichend schnell. Zwar wäre es wahrscheinlich schöner das Format an einer Stelle zu definieren, aber so werden die Daten dort definiert wo sie benötigt werden und es ist keine komplizierte Interaktion von Mesh- und Shader-Klasse zum Datenaustausch notwendig.
Eine Einschränkung ist, dass im Augenblick nur Float-Daten möglich sind. Liegt daran das das in WebGL nicht so leicht ist ein Array zu erzeugen was Daten gemischten Typs enthält. Aber in C++ oder Delphi lässt sich das Konzept leicht erweitern....z.B. ein Format-String "3f4b2f" für eine Position aus drei Floats, eine RGBA-Farbe aus Bytes und eine 2D-Texturkoordinate.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 24, 2009 21:10 
Offline
DGL Member

Registriert: Fr Jan 26, 2007 20:23
Beiträge: 12
So war auch meine Anfangsidee, Coolcat, aber dann muss ich ja auch für so primitive Objekte wie Würfel immer eine Modeldatei anlegen, statt sie direkt mit einer Funktion zu erstellen. Sehe ich das falsch?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 24, 2009 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wieso das? Deine Funktion könnte doch auch das Format zurückgeben?

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]