6

私はシェーダーが初めてで、昨日それらのいくつかをいじり始めました。Windows PC では正常にコンパイルされますが、Mac で実行すると、両方でエラーが発生します。

エラー: 0:14: '=' : 'const int' から '4-component vector of float' に変換できません

Android では、2 番目のシェーダーでのみエラーが発生します。オーバーロードされた一致する関数ドットがないという言及の上にエラーがあります。

これらは同じ頂点シェーダーを使用します。

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;
}

1 つのフラグメント シェーダー (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;

2 番目のシェーダーでは、この行にエラーがあります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 に答える