我的OpenGL学习进阶之旅解决着色器语法错误:ERROR: 0:36: ‘*‘ : wrong operand types no operation ‘*‘ exists
Posted 字节卷动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的OpenGL学习进阶之旅解决着色器语法错误:ERROR: 0:36: ‘*‘ : wrong operand types no operation ‘*‘ exists相关的知识,希望对你有一定的参考价值。
一、错误描述
今天在学习OpenGL ES的时候,编写一个片段着色器,然后运行的时候,出现了黑屏,并且查看日志报错,如下所示:
-
黑屏
-
错误日志
2021-12-21 14:26:41.736 20716-21430/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [GLUtils.cpp][loadShader][98]: [GLUtils::loadShader] func start
2021-12-21 14:26:41.737 20716-21430/com.oyp.openglesdemo I/AdrenoGLES-0: ERROR: 0:36: '*' : wrong operand types no operation '*' exists that takes a left-hand operand of type 'const int' and a right operand of type 'float' (or there is no acceptable conversion)
ERROR: 0:36: 'pow' : no matching overloaded function found
ERROR: 0:36: '-' : wrong operand types no operation '-' exists that takes a left-hand operand of type 'const int' and a right operand of type 'float' (or there is no acceptable conversion)
ERROR: 0:36: '=' : cannot convert from 'const int' to 'float'
ERROR:
2021-12-21 14:26:41.737 20716-21430/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [GLUtils.cpp][loadShader][126]: GLUtils::loadShader error compiling shader:
ERROR: 0:36: '*' : wrong operand types no operation '*' exists that takes a left-hand operand of type 'const int' and a right operand of type 'float' (or there is no acceptable conversion)
ERROR: 0:36: 'pow' : no matching overloaded function found
ERROR: 0:36: '-' : wrong operand types no operation '-' exists that takes a left-hand operand of type 'const int' and a right operand of type 'float' (or there is no acceptable conversion)
ERROR: 0:36: '=' : cannot convert from 'const int' to 'float'
ERROR: 4 compilation errors. No code generated.
2021-12-21 14:26:41.739 20716-21430/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [ShockWaveSample.cpp][create][59]: RotaryHeadSample::Init create program fail
二、分析错误
我们通过日志来找到对应的着色器代码,如下所示:
float moveDis = 1 - pow(abs(20 * diff), 4.8) * diff;
2.1 解决第一个错误
我们先来看第一句错误:
ERROR: 0:36: '*' : wrong operand types no operation '*' exists that
takes a left-hand operand of type 'const int' and a right operand
of type 'float' (or there is no acceptable conversion)
翻译过来就是
错误:0:36:“*”:操作数类型错误不存在接受“const int”类型的左侧操作数
和“float”类型的右侧操作数的操作“*”(或者没有可接受的转换)
好吧,看来提示的很明显了
因为diff
是float
类型,而20
是int
类型,所以不能使用 *
操作。
我们将20
改成20.0
,然后测试一下。
float moveDis = 1 - pow(abs(20.0 * diff), 4.8) * diff;
重新运行,还是黑屏,查看日志,比最开始的少了一个错误。
2.2 解决第2个错误
ERROR: 0:36: '-' : wrong operand types no operation '-' exists that
takes a left-hand operand of type 'const int'
and a right operand of type 'float' (or there is no acceptable conversion)
翻译过来就是
错误:0:36:“-”:错误的操作数类型不存在接受“const int”类型的左侧操作数
和“float”类型的右侧操作数的操作“-”(或者没有可接受的转换)
看起来和第一个错误类似。
因为pow(abs(20.0 * diff), 4.8) * diff
是float
类型,而1
是int
类型,所以不能使用 -
操作。
我们将1
改成1.0
,然后测试一下。
float moveDis = 1.0 - pow(abs(20.0 * diff), 4.8) * diff;
测试正常,成功加载着色器
2021-12-21 14:36:56.062 22003-22086/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [GLUtils.cpp][loadShader][98]: [GLUtils::loadShader] func start
2021-12-21 14:36:56.063 22003-22086/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [GLUtils.cpp][loadShader][98]: [GLUtils::loadShader] func start
2021-12-21 14:36:56.071 22003-22086/com.oyp.openglesdemo E/NDK_JNI_LOG_TAG: [GLUtils.cpp][createProgram][192]: [GLUtils::createProgram] func cost time 9ms
渲染出来的效果也正常,如下所示:
三、总结
GLSL中,没有隐式类型转换,原则上glsl要求任何表达式左右两侧(l-value),(r-value)的类型必须一致,否则就可能出现异常。
以上是关于我的OpenGL学习进阶之旅解决着色器语法错误:ERROR: 0:36: ‘*‘ : wrong operand types no operation ‘*‘ exists的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it
我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it
我的OpenGL学习进阶之旅解决着色器语法错误:The shader uses varying u_Color, but previous shader does not write to it
我的OpenGL学习进阶之旅着色器GLSL运行时报错 GLSL compile error: Premature end of line
我的OpenGL学习进阶之旅着色器GLSL运行时报错 GLSL compile error: Premature end of line
我的OpenGL学习进阶之旅解决着色器编译错误:#version directive must occur on the first line of the shader