如何在GLSL (WebGL)中将整数转换为浮点数?

28

我的代码如下(在void main中):

float res;

for(int i=0; i<15; i++) {

    res = float(i)/15.0;

    //...

}

很不幸,在float(i)/15.0处出现了语法错误。

如果我只写i/15.0,那么错误是:

wrong operand types  no operation '/' exists that takes a left-hand operand of type 'mediump int' and a right operand of type 'const float' (or there is no acceptable conversion)

如果我只尝试使用i/15,那么结果将是一个整数,但我想得到一个浮点数。

如何将int强制转换为float


在JavaScript中,这种转换是自动完成的 - res = i / 15; - user2417483
3
这是 GLSL,不是 JavaScript。 - Iter Ator
2
我把你的代码粘贴到glslsandbox.com上,它完全正常运行。你确定你没有从着色器的其他行得到那个错误吗? - gman
我在float(i)/15.0处遇到了语法错误。你确定吗?这似乎没问题,float(i)是将i转换为浮点数的正确方法。 - Suma
1个回答

38
看起来GLSL中不允许强制类型转换。因此,"你必须使用构造函数"

尝试这样做:

// http://www.shaderific.com/glsl-types/
// "Implicit type conversions are not supported.
// Type conversions can be done using constructors..."
float i_float = float(i);
res = i_float / 15.0;

PS: 如果你看一下文档,它说:"...整数类型可以转换为浮点数,整数和浮点数可以转换为双精度。" 我觉得奇怪的是你的代码被GLSL编译器拒绝了。(参见Reto Koradi的评论)


1
您正在查看完整的GLSL文档。WebGL使用的GLSL版本基于GLSL ES 1.00(与OpenGL ES 2.0一起使用的GLSL版本),不支持隐式类型转换。 - Reto Koradi
感谢指出。我增加了一个新的参考链接:http://www.shaderific.com/glsl-types/。 - maddouri
出于某种原因,我仍然遇到语法错误:编译着色器时发生错误:ERROR: 0:33: '1.0' : 语法错误 - Iter Ator
你能否发布整个着色器代码,这样我们就可以更具体地了解问题吗? - maddouri
3
float(x) 是可以运行的,但是 (float)x 不行... 太棒了。 - Dmytro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接