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