我遇到了以下问题。我有两个着色器(完全不相关),它们会转换为int并以不同的方式浮动。
从着色器#1(int到float)演示示例:
color = vec4(float(fragment_count) / float(MAX_FRAGMENTS));
从Shader#2(float到int)演示示例:
int abNumFrag=(int)imageLoad(abufferCounterImg, coords).r;
第一个着色器编译正常,但第二个着色器抛出错误:
“OpenGL不允许C-syle演员”
除非我启用扩展名:#extension GL_NV_gpu_shader5:enable
不是(int)someFloat与cast int(someFloat)相同吗?
答案 0 :(得分:7)
错误消息不言自明:OpenGL着色语言不使用C风格的强制转换。这些东西不是 C ;它是一种看起来有点像C的独立语言。但它不使用C风格的强制语法。
启用GL_NV_gpu_shader5可以让你这样做,因为一旦你声明你的着色器是特定于NVIDIA的,那么NVIDIA喜欢对OpenGL规范采取自由。它实际上不是NV_gpu_shader5 extension specification的函数。
答案 1 :(得分:3)
实际上,但不是名义上的。 GLSL转换是通过直接调用构造函数完成的,不允许类似C语言的类型转换。
答案 2 :(得分:0)
int abNumFrag=int(imageLoad(abufferCounterImg, coords).r);
与float相同。