在Kivy中将变量传递给GLSL

时间:2015-12-28 18:52:26

标签: python glsl shader kivy

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

#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传递给片段着色器,这样我每次申请时都不必这样做想要显示一个新颜色的对象?

1 个答案:

答案 0 :(得分:2)

我发现了怎么做。

要将变量传递给GLSL,只需要将变量添加为widget的画布的键。在我的例子中,向片段着色器添加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;
}