Допустим, у меня есть довольно сложный фрагментный шейдер для определения того, сколько света попадает на каждый пиксель:
//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 в язык шейдеров, не регенерируя весь шейдер и не перекомпилируя его (это было бы медленно). В идеале, для каждого четырехугольника, который я рисую, я хотел бы обновлять параметры шейдера.