在 Kivy 中将变量传递给 GLSL

Passing variables to GLSL in Kivy

我正在尝试在 Kivy 中做一些基本的 3D,但在将变量发送到 .glsl 片段着色器时遇到了问题。我从 this example 开始。我设法在场景中编写了对象的移动和旋转,但现在我正在尝试应用自定义着色器。这是示例中的顶点着色器:

#ifdef GL_ES
    precision highp float;
#endif

varying vec4 normal_vec;
varying vec4 vertex_pos;
uniform mat4 normal_mat;

void main (void) {
    vec4 v_normal = normalize(normal_mat*normal_vec);
    vec4 v_light = normalize(vec4(0, 0, 0, 1)-vertex_pos);
    float theta = clamp(dot(v_normal, v_light), 0.0, 1.0);
    gl_FragColor = vec4(theta, theta, theta, 1.0);
}

我只是想动态地为对象设置我自己的颜色,但我无法将颜色值传递给着色器。目前我正在

中动态生成 .glsl 个文件
cache/shaders/diffuse_xxxxxx.glsl

其中 xxxxxx 是颜色及其线条的十六进制值

gl_FragColor = vec4(theta, theta, theta, 1.0);

替换为

gl_FragColor = vec4(theta*{0}, theta*{1}, theta*{2}, 1.0);

其中 {0}, {1}, {2} 是 r、g、b 在 0 和 1 之间浮动。如何将 vec4 传递给片段着色器,这样我就不必每次都执行此操作想用新颜色显示对象?

我知道怎么做了。

要将变量传递给 GLSL,只需将变量作为键添加到小部件的 canvas。在我的例子中,将 vec4 变量添加到片段着色器意味着具有

self.canvas["object_colour"] = (1., )*4  # colour tuple here

在我的小部件代码中,现在我可以像这样使用它了:

#ifdef GL_ES
    precision highp float;
#endif

varying vec4 normal_vec;
varying vec4 vertex_pos;
uniform mat4 normal_mat;
uniform vec4 object_colour;

void main (void) {
    vec4 v_normal = normalize(normal_mat*normal_vec);
    vec4 v_light = normalize(vec4(0, 0, 0, 1)-vertex_pos);
    float theta = clamp(dot(v_normal, v_light), 0.0, 1.0);
    gl_FragColor = vec4(theta, theta, theta, 1.0)*object_colour;
}