Nehmen wir an, ich habe einen ziemlich komplexen Frag-Shader, um herauszufinden, wie viel Licht auf jedes Pixel fällt:
//shaders/screen.frag
varying vec4 vertColor; //unlit color
float intensity = 1.0; //lighting intensity.
//parameters vary from material to material:
float roughness_rms; //root-mean-square roughness (um).
float peak_angle; //how steep peaks are on average.
/* more parameters */
void main(){
/* complex shader code to calculate intensity */
gl_FragColor = intensity*vertColor; //set the light strength
}
Hier ist, wie ich die Shader initialisiere:
//something.java
import <needed crap>
int shader, fragShader;
shader=ARBShaderObjects.glCreateProgramObjectARB();
fragShader=createFragShader("shaders/screen.frag");
ARBShaderObjects.glAttachObjectARB(shader, fragShader);
ARBShaderObjects.glLinkProgramARB(shader);
ARBShaderObjects.glValidateProgramARB(shader);
Und wie ich sie verwende:
//something.java
ARBShaderObjects.glUseProgramObjectARB(shader);
GL11.glBegin(GL11.GL_QUADS);
//etc.
Mein Java-Code berechnet roughness_rms und andere Parameter für verschiedene Materialien. Außerdem ändern sich diese Parameter bei Einschlägen von Geschossen usw. Meine Frage ist: Wie kann ich Variablen von meinem Java an die Shader-Sprache übergeben, ohne den gesamten Shader neu zu generieren und neu zu kompilieren (das wäre langsam). Im Idealfall möchte ich bei jedem Quad, das ich zeichne, die Shader-Parameter aktualisieren.