0

現在、頂点シェーダーから1つのフロートを渡しています:

varying float fog_factor;
...
fog_factor = clamp(gl_Position.z, 0.0, 1.0);
...

フラグメントシェーダーへ:

varying float fog_factor;
...
gl_FragColor = texture2D(sampler_texture_4, ...) * fog_factor;
...

私の質問ですが、Javaコードに追加する必要があるものはありますか?floatの配列を渡すときは、次のようなものを追加する必要があります。

vertex_position_handle = GLES20.glGetAttribLocation(program, "vertex_position");
GLES20.glEnableVertexAttribArray(vertex_position_handle);
GLES20.glVertexAttribPointer(vertex_position_handle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertex_buffer);

今のところ、私はフロートのJavaコードでこれを行っているだけです:

fog_handle = GLES20.glGetAttribLocation(program, "fog_factor");

このコードは私のデバイスで機能しているので、これを求めていますが、他の人ではクラッシュします...

4

1 に答える 1

0

問題は、fog_factor が可変であることです。これにより、頂点からフラグメント シェーダーに情報が渡されますが、クライアント (Java) コードからアクセスすることはできません。情報をシェーダーに送信する場合は、属性または均一変数が必要です。

属性は頂点ごとに変更できますが、ユニフォームは頂点の各セットで同じままです (glDrawElements 呼び出し)

私が頂点シェーダーで頻繁に行うことは次のとおりです。

  attribute vec2 clientTexCoord;
  varying vec2 texCoord;  

  main(){
        ... // other code
        texCoord = clientTexCoord;
        ... // other code
  }

クライアント/Javaコードで、正しく行っているようにclientTexCoordの属性の場所を取得します。これが現在正しく動作することは信じられないことですが、一部の GLSL コンパイラが他のものよりも少しうるさいことがあるのを見てきました。

頂点シェーダーを変更して、属性を渡してさまざまな fog_factor の値を設定できるようにしてみてください。

于 2013-01-25T18:19:49.373 に答える