我试图在Kivy中做一些基本的3D操作,并且在向.glsl片段着色器发送变量时遇到了困难。我从这个例子开始。我成功地写了场景中物体的移动和旋转,但现在我正在尝试应用自定义着色器。这是示例中的顶点着色器:
#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}
在0到1之间浮动时,我怎样才能将vec4
传递给片段着色器,这样我就不必每次应用程序想要显示一个新颜色的物体时都要这样做?
发布于 2016-01-02 12:12:00
我找到了怎么做的。
要将变量传递给GLSL,只需将变量作为键添加到小部件的画布中即可。在我的例子中,向片段着色器添加一个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;
}
https://stackoverflow.com/questions/34499035
复制相似问题