【问题标题】:OpenGL bool uniform?OpenGL布尔统一?
【发布时间】:2016-02-14 21:12:36
【问题描述】:

我正在尝试将布尔值发送到 OpenGL glsl 着色器。

目前我在着色器中有这个:

uniform bool foo;

我用它来设置它:

glUniform1i(glGetUniformLocation(shader, "foo"), true);

似乎没有glUniform1b,所以我将其设置为整数。这似乎工作正常。

这种方法有什么问题吗?它是可移植的,还是会在其他显卡/驱动程序上中断?我目前使用的是 OpenGL 4.3。

【问题讨论】:

  • 据我所知,它与 4 字节 alingment 有关(布尔值是 1 字节,因此无论哪种方式,最后都会添加 3 个额外的填充字节),因此使用布尔值效率不高而且可能甚至在 OpenGL 中已弃用
  • @Amadeusz 它肯定不会被弃用。

标签: c++ opengl boolean shader


【解决方案1】:

§ 4.1 基本类型 OpenGL 着色语言支持以下基本数据类型,分组如下:

  • bool 条件类型,取值为真或假
  • bvec2 一个二元布尔向量
  • bvec3 三分量布尔向量
  • bvec4 一个四分量布尔向量

...

§ 4.1.2 布尔值 为了使代码的条件执行更容易表达,支持 bool 类型。不期望硬件直接支持这种类型的变量。 (...)

关于设置:

§ 2.2.1 (...) 当使用与该状态的实际类型不同的参数类型指定状态值时,数据转换是 执行如下:

  • 当内部状态类型为布尔值时,零整数或浮点值将转换为FALSE,非零值将转换为TRUE

【讨论】:

  • 谢谢。 4.1 意味着我可以在我的 glsl 着色器中使用 bool。 4.1.2 并没有真正帮助我。仍然没有回答的是我是否可以使用 glUniform1i 设置布尔统一...
  • @JanRüegg 也为此添加了报价
【解决方案2】:

glsl bool 的大小是 32 位,与 int 相同,所以是的,您可以这样设置。

不,它不会在其他用于 OpenGL 的显卡/驱动程序上中断。

【讨论】:

  • “小于或等于零的整数被认为是错误的” 另一个答案声称非零整数总是错误的。 “bool 占用 1 个字节” 我不确定,另一个答案声称 “不期望硬件直接支持这种类型的变量”
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多