在 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;
}
我正在尝试在 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;
}