假设我有一个相当复杂的片段着色器来计算每个像素有多少光:
//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 代码计算各种材料的粗糙度_rms 和其他参数。此外,当子弹等受到影响时,这些参数会发生变化。我的问题是:如何在不重新生成整个着色器并重新编译它的情况下将变量从我的 java 传递到着色器语言(这会很慢)。理想情况下,我绘制的每个四边形都想更新着色器参数。