各ピクセルにどれだけの光が入るかを把握するためのかなり複雑なフラグシェーダーがあるとしましょう。
//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
}
シェーダーを初期化する方法は次のとおりです。
//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);
そして、私がそれらをどのように使用するか:
//something.java
ARBShaderObjects.glUseProgramObjectARB(shader);
GL11.glBegin(GL11.GL_QUADS);
//etc.
私のJavaコードは、roughness_rmsを計算し、その他のパラメーターはさまざまなマテリアルを形成します。さらに、これらのパラメーターは、箇条書きなどの影響がある場合に変更されます。私の質問は、シェーダー全体を再生成して再コンパイルせずに、Javaからシェーダー言語に変数を渡すにはどうすればよいですか(遅いでしょう)。理想的には、描画するすべてのクワッドでシェーダーパラメーターを更新したいと思います。