Ich lerne OpenGL-Shader mit AndEngine, mein Ziel ist es, DynamicSpriteBatch mit etwas lightshader zu machen, wo die Lichtposition durch vbo zu jedem Zeichenaufruf in SpriteBatch geleitet wird, so dass ich die Lichtquelle auf jedem Sprite manipulieren kann.
Also habe ich LightSpriteBatch (mit drawtype.dynamic)
erstellt %Vor%LightShader
%Vor%}
Ich habe auch benutzerdefinierte HighPerformanceLightSpriteBatchVBO erstellt, wo ich Lichtposition in Puffer
übergebe %Vor%mit all dem funktioniert es, aber ich habe Probleme beim Lesen dieser Lichtposition im Fragment-Shader. Welche Berechnungen muss ich durchführen, um den Abstand zwischen Lichtposition und Position korrekt zu berechnen, wenn die Textur gerendert wird?
%Vor%Licht ist immer in der Mitte (200-Radius / 2.200-Radius / 2) und sollte als letzte Parameter um 100.100 verschoben werden
Wenn ich es richtig verstehe, ist die relative Lichtposition im Fragment-Shader, die für jedes Pixel unterschiedlich ist. Dazu müssen Sie auf die Modellansichts- und Projektionsmatrizen im Vertex-Shader zugreifen und die Vektoren up
und right
berechnen, damit Ihr Sprite an den Fragment-Shader übergeben wird. Dann fügen Sie im Fragment-Shader diese (multipliziert mit der Texkoord) zur Sprite-Mittelposition hinzu, um die Weltraumposition jedes schattierten Fragments (jedes Pixel des Sprites) zu erhalten. Subtrahiere das von der Lichtposition und voila!
Beachten Sie, dass Sie in Ihrem Shader-Code scheinbar unterschiedliche Präzisionsspezifizierer für varying
-Variablen in Vertex- / Fragment-Shadern haben. Dies kann zu Problemen führen (die Variablen können nicht verknüpft werden, sodass der Wert, der im Vertex-Shader ausgegeben wird, verworfen wird und der Eingabewert im Fragment-Shader nicht definiert ist). Dies ist eine der dunklen Ecken von OpenGL, etwas verursacht durch die Anforderung, unterschiedliche Vertex- und Fragment-Shader beliebig mischen und abgleichen zu können.