0

これが私が使用しようとしているフラグメントシェーダーコードです(OpenGL ES 2.0、OpenGLES GLSL ES 1.00):

GLchar strFragmentShader[] =  
"precision mediump float;                                              \n"
"varying vec2 vTexCoord;                                               \n"
"uniform sampler2D sTexture;                                           \n"
"uniform float offset[] = float[]( 0.0000, 1.3846, 3.2307);            \n"
"uniform float weight[] = float[]( 0.2270, 0.3162, 0.0702);            \n"
"void main()                                                           \n"
"{                                                                     \n"
"  vec4 sum = texture2D( sTexture, vec2(vTexCoord)/1024.0)*weight[0];  \n"
"  for (int i=0;i<3;i++) {                                                                 \n"
"    sum += texture2D( sTexture, ( vec2(vTexCoord+vec2(0.0,offset[i])/1024.0 )*weight[i];  \n"
"    sum += texture2D( sTexture, ( vec2(vTexCoord-vec2(0.0,offset[i])/1024.0 )*weight[i];  \n"
"  }                                                                                       \n"  
"  gl_FragColor = sum;                                                 \n"
"}                                                                     \n";

基本的にこのページの例に従っていますが、ERROR:LEX/PARSE-1 (fragment shader, line 4) Syntax error.

ここ(配列コンストラクターの下) で提案されているのconstではなく、それらを宣言しようとすると、 . uniformERROR:CUSTOM-5 (fragment shader, line 4) Array cannot be const

明らかに、4行目と5行目に同じ問題があります。これをコンパイルするにはどうすればよいですか?正しい構文は何ですか?

4

2 に答える 2

0

これは GLES の単なる制限であることが判明しました。それはできません。別の方法を見つける必要があります。

于 2013-10-18T17:41:45.367 に答える
0

私は次のようにします:

GLchar strFragmentShader[] =  
"precision mediump float;                                              \n"
"varying vec2 vTexCoord;                                               \n"
"uniform sampler2D sTexture;                                           \n"
"void main()                                                           \n"
"{ 
"   vec3 offset = vec3(0.0000, 1.3846, 3.2307);            \n"
"   vec3 weight = vec3( 0.2270, 0.3162, 0.0702);            \n"                                                                    \n"
"  vec4 sum = texture2D( sTexture, vec2(vTexCoord)/1024.0)*weight[0];  \n"
"  for (int i=0;i<3;i++) {                                                                 \n"
"    sum += texture2D( sTexture, ( vec2(vTexCoord+vec2(0.0,offset[i])/1024.0 )*weight[i];  \n"
"    sum += texture2D( sTexture, ( vec2(vTexCoord-vec2(0.0,offset[i])/1024.0 )*weight[i];  \n"
"  }                                                                                       \n"  
"  gl_FragColor = sum;                                                 \n"
"}" 

または、ユニフォームとしてシェーダーに渡す必要がある場合は、次のようにします。

GLchar strFragmentShader[] =  
"precision mediump float;                                              \n"
"varying vec2 vTexCoord;                                               \n"
"uniform sampler2D sTexture;                                           \n"
"uniform vec3 offset;                                                    \n"
"uniform  vec3 weight;                                                  \n" 
"void main()                                                           \n"
"{                                                                    \n"
"  vec4 sum = texture2D( sTexture, vec2(vTexCoord)/1024.0)*weight[0];  \n"
"  for (int i=0;i<3;i++) {                                                                 \n"
"    sum += texture2D( sTexture, ( vec2(vTexCoord+vec2(0.0,offset[i])/1024.0 )*weight[i];  \n"
"    sum += texture2D( sTexture, ( vec2(vTexCoord-vec2(0.0,offset[i])/1024.0 )*weight[i];  \n"
"  }                                                                                       \n"  
"  gl_FragColor = sum;                                                 \n"
"}" 

または、配列が必要な場合は 2 番目の例の目的の (一定の) サイズはuniform float[n]where is を使用し、配列が必要で C++ コードから値を渡したくない場合は最初の例を使用します。nconst float[n]

于 2013-10-16T12:36:39.347 に答える