我的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”类型的右侧操作数的操作“*”(或者没有可接受的转换)


好吧,看来提示的很明显了
因为difffloat类型,而20int类型,所以不能使用 * 操作。

我们将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) * difffloat类型,而1int类型,所以不能使用 - 操作。

我们将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