为什么OpenGL自定义着色器会出现此错误



我在XCode11上的macOS应用程序中使用了一个带有cocos2d 3.17的自定义着色器,但我遇到了一些问题。

myShader.frag

#ifdef GL_ES
precision lowp float;
#endif
uniform sampler2D u_texture;
varying lowp vec4 v_fragmentColor;
uniform mat4 u_rotation;
void main()
{
mat4 t1= mat4(1);
mat4 t2= mat4(1);
t1[3] = vec4(-0.5,-0.5,1,1);
t2[3] = vec4(+0.5,+0.5,1,1);
vec2 pos = (t2 * u_rotation * t1 * vec4(gl_PointCoord, 0, 1)).xy;
gl_FragColor  =  v_fragmentColor * texture2D(u_texture, pos);
}

myShader.vert

attribute vec4 a_position;
uniform float u_pointSize;
uniform lowp vec4 u_fragmentColor;
varying lowp vec4 v_fragmentColor;
void main()
{
gl_Position     = CC_MVPMatrix * a_position;
gl_PointSize    = u_pointSize;
v_fragmentColor = u_fragmentColor;
}

使用此配置,我会出现以下错误:

cocos2d:错误:0:21:"vec4":语法错误:语法错误

关于myShader.vert

我不明白,对我来说似乎很好。

着色器是为OpenGL ES(GLSL ES 1.00(编写的。当您尝试使用"桌面"OpenGL编译着色器时,由于精度限定符的原因,会出现错误。

删除顶点着色器中的精度限定符:

attribute vec4 a_position;
uniform float u_pointSize;
uniform vec4 u_fragmentColor;
varying vec4 v_fragmentColor;
void main()
{
gl_Position     = CC_MVPMatrix * a_position;
gl_PointSize    = u_pointSize;
v_fragmentColor = u_fragmentColor;
}

和碎片着色器:

#ifdef GL_ES
precision lowp float;
#endif
uniform sampler2D u_texture;
varying vec4 v_fragmentColor;
uniform mat4 u_rotation;
// [...]

精度限定符已添加到GLSL 1.30(OpenGL 3.0(与OpenGL ES的代码可移植性(非功能性(中,但在以前的版本中不支持它们
(由于您没有指定版本,因此您使用的是GLSL 1.00(


或者,您可以使用宏作为精度限定符:

#ifdef GL_ES
#define LOWP lowp 
#else
#define LOWP
#endif
attribute vec4 a_position;
uniform float u_pointSize;
uniform LOWP vec4 u_fragmentColor;
varying LOWP vec4 v_fragmentColor;
// [...]
#ifdef GL_ES
precision lowp float;
#define LOWP lowp 
#else
#define LOWP
#endif
uniform sampler2D u_texture;
varying LOWP vec4 v_fragmentColor;
uniform mat4 u_rotation;
// [...]

最新更新