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.
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:
"myshader.prg":{
"vertexShader":"myshader.vs",
"fragmentShader":"myshader.fs",
"attributes":["aPosition","aNormal","aTexCoord"],
"textures":["uTexture","uBumpmap"]
}
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:
"mymesh.mesh":{
"format":"332",
"vertices":[...],
"indices":[...]
}
Der Format-String wird überprüft und in ein Array umgewandelt, beim rendern wird das ganze dann so gesetzt:
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.
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?
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.