我正在尝试设置一个uniform float的Clutter.ShaderEffect。如果浮点数被传递给set_uniform_value(),这是很好的。但是,当您传递整数时,将引发OpenGL错误(1282,无效操作)。在这种情况下,实现似乎假定统一实际上是int类型的。下面是一个很小的例子:
const {Clutter, GObject} = imports.gi;
Clutter.init(null);
let stage = new Clutter.Stage({width: 200, height: 200});
let shader = new Clutter.ShaderEffect({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
shader.set_shader_source(`
uniform float value;
void main(void) {
cogl_color_out = vec4(value, 0, 0, 1);
}
`);
// This creates the OpenGL Error.
// shader.set_uniform_value('value', 1);
// This works however:
shader.set_uniform_value('value', 0.999);
stage.add_effect(shader);
stage.connect('destroy', () => Clutter.main_quit());
stage.show();
Clutter.main();那么,如何强制set_uniform_value()将该值解释为浮点数?阅读文档(https://gjs-docs.gnome.org/clutter6~6_api/clutter.shadereffect#method-set_uniform_value)时,我假设可以传递一个GObject.Value --可能是这样的:
let value = new GObject.Value();
value.init(GObject.TYPE_FLOAT);
value.set_float(1.0);
shader.set_uniform_value('value', value);但这会产生错误Invalid uniform of type 'GValue' for name 'value'。也许我现在有一个GObject.Value,其中包含一个包含GObject.TYPE_FLOAT的GObject.Value
发布于 2021-04-21 05:38:51
在GJS1.68.0 (GNOME 40)中,传递一个GObject.Value工作:
let value = new GObject.Value();
value.init(GObject.TYPE_FLOAT);
value.set_float(1);
shader.set_uniform_value('value', value);发布于 2021-04-12 04:02:31
如果有人在找这个问题,我有答案
https://gjs-docs.gnome.org/clutter7~7_api/clutter.shadereffect#method-set_uniform_value值-用于浮点数的GObject.Value GObject.TYPE_FLOAT
在gjs中,GTK Javascript有https://gjs-docs.gnome.org/clutter7~7_api/clutter.value_set_shader_float
value_set_shader_float(value,[float])方法-值必须已使用%CLUTTER_TYPE_SHADER_FLOAT初始化。
在GTK的Javascript版本中,他们没有任何方法来初始化CLUTTER_TYPE_SHADER_FLOAT或GObject.TYPE_FLOAT
解决方案是
function make_float(val) {
return Math.floor(val)==val?val+0.000001:val;
}https://stackoverflow.com/questions/62254719
复制相似问题