4

GLSLプログラムに値を渡す方法について、さまざまな例を検索し、読み、試しました。しかし、悲しいことに、すべての試みは失敗でした:(

私がやろうとしていることは非常に単純です: Android アプリ内で gl 3d アニメーションを少し開くだけです。私の GUI 設計の結果として、TextureView を OpenGl Surface として使用することを好みます。私のプロジェクトにぴったりのコードを見つけました。

しかし、私の問題は完全にこの例の中にあるようです。

コンパイルして実行すると、本来の動作を正確に実行します。画面上に 1 つの三角形を描画します。

次に、Vertex Shader を次のように変更しました。

final String vertexShaderSource = 
   "attribute vec4 position;\n" +
   "attribute float myValue;\n" +
   "void main () {\n" +
         "vec4 oo;\n"+
         "oo[0] = position[0];\n"+
         "oo[1] = position[1] * myValue;\n"+
         "oo[2] = position[2];\n"+
         "oo[3] = position[3];\n"+
         "gl_Position = oo;\n" +
   "}";

そして今、属性に値を渡したいと思いますmyValue

これが run メソッドへの私の変更です。

public void run() {
   initGL();

   int attribPosition = GLES20.glGetAttribLocation(mProgram,
           "position");
   checkGlError();

   int valuePosition = GLES20.glGetAttribLocation(mProgram,
           "myValue");
   checkGlError();

   System.out.println("att id:"+ attribPosition 
           + " val id:" + valuePosition);

//[...]

   while (true) {
       checkCurrent();

       mVertices.position(0);
       GLES20.glVertexAttribPointer(attribPosition, 3,
                 GLES20.GL_FLOAT, false, 0, mVertices);
       checkGlError();

       GLES20.glUniform1f(valuePosition, 1.5f);
       checkGlError();
    //[...]           
    }
}

私の理解では、これにより、y 軸上の三角形が 1.5f 倍に拡大されます。しかし、それは機能していません。私のデバッグ行の出力は次のとおりです。

I/System.out(22427): att id:1 val id:0

-1 のコンテンツがないため、これらは正しい場所である必要があります。しかし、withに値1.5fを渡すことによって達成できる唯一の結果は、継続的な出力です。シェーダー スクリプトは を受信せず、値 0 を使用して展開するため、三角形はもうありません。myValueglUniform1fOpenGL Error 0x5021.5f

誰かが私に説明してくれることを本当に願っています、これを成し遂げる方法。それは非常に基本的なことなので、ここで非常に明白な何かが欠けていると思います.

4

3 に答える 3

2

で設定する前に、ユニフォームを宣言する必要がありますglUniform1f。それで、myValueasを均一にします。

uniform float myValue;

次に、値をバインドするためにその場所が必要です。関数を使用してそれを行うことができますglGetUniformLocation

int valuePosition = GLES20.glGetUniformLocation(mProgram, "myValue");

最後に、glUniform関数を使用してその場所の制服を設定します。

GLES20.glUniform1f(valuePosition, 0.5f);

また、属性を使用しても同じ結果を得ることができます。属性は常に変化する値に対して効率的ですが、ユニフォームはあまり変化しない値に対して効率的です。

于 2014-07-07T13:53:31.573 に答える