首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用Clutter.ShaderEffect.set_uniform_value()?

如何正确使用Clutter.ShaderEffect.set_uniform_value()?
EN

Stack Overflow用户
提问于 2020-06-08 03:49:35
回答 2查看 118关注 0票数 0

我正在尝试设置一个uniform floatClutter.ShaderEffect。如果浮点数被传递给set_uniform_value(),这是很好的。但是,当您传递整数时,将引发OpenGL错误(1282,无效操作)。在这种情况下,实现似乎假定统一实际上是int类型的。下面是一个很小的例子:

代码语言:javascript
复制
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 --可能是这样的:

代码语言:javascript
复制
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_FLOATGObject.Value

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-21 05:38:51

在GJS1.68.0 (GNOME 40)中,传递一个GObject.Value工作:

代码语言:javascript
复制
let value = new GObject.Value();
value.init(GObject.TYPE_FLOAT);
value.set_float(1);
shader.set_uniform_value('value', value);
票数 1
EN

Stack Overflow用户

发布于 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

解决方案是

代码语言:javascript
复制
function make_float(val) {
    return Math.floor(val)==val?val+0.000001:val;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62254719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档