Ошибка шейдера GLSL на Mac, но не на Windows: невозможно преобразовать из «const int» в «4-компонентный вектор с плавающей запятой»

Я новичок в шейдерах и вчера начал играть с некоторыми из них. Они отлично компилируются на моем ПК с Windows, но когда они запускаются на Mac, для обоих возникает ошибка:

ОШИБКА: 0:14: '=': невозможно преобразовать из 'const int' в '4-компонентный вектор числа с плавающей запятой'

На Android только второй шейдер выдает ошибку. В нем есть ошибка выше, где упоминается, что нет перегруженной точки соответствующей функции.

Они используют один и тот же вершинный шейдер:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 vColor;
varying vec2 vTexCoord;

void main() {
    vColor = a_color;
    vTexCoord = a_texCoord0;
    gl_Position =  u_projTrans * a_position;
}

Один фрагментный шейдер (ошибка на Mac):

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif

varying LOWP vec4 vColor;
varying vec2 vTexCoord; 
uniform sampler2D u_texture;
void main() {
    vec4 texColor = texture2D(u_texture, vTexCoord); 
    texColor.rgb = 1.0 - texColor.rgb;
    gl_FragColor = texColor * vColor;
}

Другой фрагментный шейдер (ошибка на Mac и Android):

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif

varying LOWP vec4 vColor;
varying vec2 vTexCoord; 
uniform sampler2D u_texture;            
void main() {
    vec4 texColor = texture2D(u_texture, vTexCoord); 
    vec3 gray = vec3(0.2125, 0.7154, 0.0721);
    vec4 color = dot(gray, texColor);
    color.a = texColor.a;
    gl_FragColor = color * vColor;
}

person DustinRiley    schedule 16.12.2012    source источник
comment
Какая строка в каком файле вызывает эту ошибку?   -  person Aaron    schedule 17.12.2012


Ответы (1)


В первом шейдере у вас ошибка в этой строке - texColor.rgb = 1.0 - texColor.rgb; Вам нужно написать:

texColor.rgb = vec3(1.0) - texColor.rgb;

Во втором шейдере у вас есть ошибка в этой строке - vec4 color = dot(gray, texColor); Gray - это vec3, texcolor - это vec4. Что такое скалярное произведение между vec3 и vec4? Нет такой dot функции, которая бы это делала. Вы можете позвонить либо float dot(vec3, vec3), либо float dot(vec4, vec4). Поэтому измените эту строку на:

vec4 color = vec4(dot(gray, texColor.rgb));

or

vec4 color = vec4(dot(vec4(gray, ???), texColor)); // put in ??? float number you want

(и в следующий раз, пожалуйста, покажите нам, в какой именно строке возникает ошибка)

person Mārtiņš Možeiko    schedule 17.12.2012
comment
Большое спасибо. Я бы с удовольствием поделился номерами строк, но эта ошибка была единственной, что он выдал. Я не знал, нужен ли мне какой-то профилировщик или что-то еще, чтобы получить больше от этого. Извините, я не мог предоставить больше. - person DustinRiley; 17.12.2012