Wie umfangreich wird in der Regel der Anteil selbst geschriebener "Interaktionslogik" ?
if(MaustasteGedrückt())
{
FrageMauszeigerPositionab()
BerechneKraftNachSelbstWillkürlichGewähltenFormeln(MauszeigerPosition)
}
Nicht so aufwändig würde ich sagen . . .
Die Shader machen den Großteil der Arbeit?
Die Shader kümmern sich im Optimalfall bei einem solchen Problem nur um die Darstellung, nicht um die physikalische Simulation selbst. (Natürlich kann man die physikalische Simulation auch mit Hilfe von Shadern berechnen, aber davon würde ich hier dringend abraten). In einfachsten Fall hättest du dann einen solchen Shadercode um deinen Schlauch zu zeichnen:
//VertexShader:
uniform mat4 ModelviewProjection;
in vec4 PositionIn;
void main()
{
gl_Position = ModelviewProjection*Position;
}
//Fragmentshader:
out vec4 Color;
void main()
{
Color= vec4(1,0,0,1);
}
Das obige Vertexshaderprogramm würde für jeden Eckpunkt der Dreiecke deines Meshes einmal aufgerufen werden. Dies würde dir nun die Eckpunkte der Segmente deines Schlauches (PositionIn), welche dir zuvor die physikalische Simulation berechnet hat mit der Kameratransformationsmatrix (ModelviewProjection) passend transformieren. Das Ergebnis davon (gl_Position) dient dazu, dass der Rasterisierer weiss, wo auf dem Bildschirm die Ecken eines Dreiecks abgebildet werden. Dann geht der Rasterisierer her und bestimmt welche Pixel auf dem Bildschirm das Dreieck bedeckt und startet für jeden dieser Pixel obiges Fragmentshaderprogramm. Dieses Programm würde dann in den Framebuffer die Farbe 1,0,0,1 also rot rausschreiben.
Gibt es zum erzeugen des Schlauchfragments fertige Standardfunktionen oder muss das Objekt eigenständig mathematisch berechnet werden?
Bei reinem WebGL nicht, soetwas spezielles ist eher in komplexeren 3D-Engines oder Physikengines vorhanden. Solche bei einem so einfachen Problem zu verwenden ist m.E. allerdings etwas ein Overkill.
Seh ich das richtig wenn ich denke dass ein Objekt erzeugt wird und eine in der Regel schon vorhandene Funktion (Pixel-Shader ?) dafür sorgt dass sich seine Oberfläche wie Gelee verhält oder schreibt man die Eigenschaft selbst?
Dein Pixelshader (in OpenGL Fragmentshader genannt) sorgt in dem meisten Fällen nur für Licht und Materialeffekte (wie durchsichtig ist die Oberfläche, wie reflektiert sie das Licht) und wird, wie bereits erwähnt, nicht dafür verwendet, dass die Oberfläche sich bei Krafteinwirkung wie Gelee verformt. Des Weiteren sind Shader an sich "sehr low Level". Wenn man einen Effekt erzielen will, so muss man ihn durch mathematische Formeln formulieren, es sei denn man findet irgendein Framework, welchem einen dies abnimmt oder erleichtert. Diverse 3D-Engines haben afaik solche fortgeschrittenen Shadereditoren.