0

我遇到了以下问题。我有两个着色器(完全不相关),它们强制转换为 int 和浮动,但方式不同。

来自 Shader #1 的投射示例(int 到 float):

 color = vec4(float(fragment_count) / float(MAX_FRAGMENTS));

来自 Shader #2 的投射示例(浮点数到整数):

  int abNumFrag=(int)imageLoad(abufferCounterImg, coords).r;

第一个着色器编译正常,但第二个抛出错误:

“OpenGL 不允许 C 样式转换”

除非我启用扩展:#extension GL_NV_gpu_shader5:启用

(int)someFloat 与强制转换 int(someFloat) 不一样吗?

4

3 回答 3

7

错误消息不言自明:OpenGL 着色语言不使用 C 样式转换。这不是C的东西;它是一种独立的语言,看起来有点像 C。但它不使用 C 风格的强制转换语法。

启用 GL_NV_gpu_shader5 允许你这样做,因为一旦你声明你的着色器是 NVIDIA 特定的,NVIDIA 喜欢自由使用 OpenGL 规范。它实际上不是NV_gpu_shader5 扩展规范的功能。

于 2013-06-04T11:46:02.967 回答
3

实际上,但不是名义上的。GLSL 转换是通过直接调用构造函数来完成的,不允许在类似 C 的意义上进行类型转换。

于 2013-06-04T11:45:56.477 回答
0
int abNumFrag=int(imageLoad(abufferCounterImg, coords).r);

与浮动相同。

于 2018-12-21T07:20:39.637 回答