gpt4 book ai didi

java - 使用 lwjgl 将值从我的 Java 程序传递到 GLSL

转载 作者:搜寻专家 更新时间:2023-11-01 02:32:23 25 4
gpt4 key购买 nike

假设我有一个相当复杂的碎片着色器,用于计算每个像素有多少光:

//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 代码计算各种 Material 的 roughness_rms 和其他参数。此外,当受到子弹等的影响时,这些参数会发生变化。我的问题是:如何在不重新生成整个着色器并重新编译它的情况下将变量从我的 java 传递到着色器语言(那样会很慢)。理想情况下,我绘制的每个四边形都希望更新着色器参数。

最佳答案

你需要看看the GLSL Specs中的“制服” .

基本上,它是着色器变量的存储限定符,指示它将从着色器外部(即 CPU 端)设置,并且更改频率低于输入(每个几何批处理最多一次,而不是每个顶点一次)。

这个变量存在于整个程序的范围内(即顶点着色器+片段着色器+可选的几何和曲面分割着色器);如果您想在顶点着色器和片段着色器中使用它,您需要在两者中声明它,但您只需在客户端代码中设置一次。

为了实际设置变量,您需要在程序处于 Activity 状态时查询制服的位置(按名称)。只要程序不被重新编译,这个位置就是稳定的,因此您可以缓存它并在需要时重用它。只要不重新编译程序,您设置的值也会保留。

例如,设置单个 float (这是 OpenGL 3+;我不确定该级别以下的语法是否完全相同)。

在你的着色器中:

uniform float my_value;

在您的客户端代码中:

glUseProgram(program_id);
GLint my_value_loc = glGetUniformLocation(program_id, "my_value");
glUniform1f(my_value_loc, 1.0);
glUseProgram(0);

这是 glGetUniformLocation 的引用(易于使用)和 glUniformXX ,这有点复杂(设置整数、 float 、数组、矩阵等的许多变体)。

关于java - 使用 lwjgl 将值从我的 Java 程序传递到 GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6010690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com