почему мой пользовательский шейдер OpenGL выдает эту ошибку? - PullRequest
2 голосов
/ 16 апреля 2020

Я использую собственный шейдер с cocos2d 3.17 для своего приложения macOS на XCode11, но у меня есть некоторые проблемы.

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: ERROR: 0:21: 'vec4' : syntax error: syntax error

относительно myShader.vert

Я не понимаю, мне кажется, хорошо ... Кто-нибудь может мне помочь? Спасибо, я буду ждать вашего ответа.

Елена

1 Ответ

3 голосов
/ 16 апреля 2020

Шейдер написан для 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;

// [...]
...