6

我是着色器的新手,我昨天开始玩其中的一些。它们在我的 Windows PC 上编译得很好,但是当它们在 Mac 上运行时,两者都有一个错误:

错误:0:14:“=”:无法从“const int”转换为“float 的 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;
}
4

1 回答 1

5

在第一个着色器中,您在这一行有错误 -texColor.rgb = 1.0 - texColor.rgb;您需要编写:

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

在第二个着色器中,这一行有错误 -vec4 color = dot(gray, texColor);灰色是 vec3,texcolor 是 vec4。vec3 和 vec4 之间的点积是什么?没有这样的dot功能可以做到这一点。您可以调用float dot(vec3, vec3)float dot(vec4, vec4)。所以将该行更改为:

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

或者

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

(下次请告诉我们究竟发生在哪一行错误)

于 2012-12-17T00:47:44.873 回答