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 を使用して展開するため、三角形はもうありません。myValue
glUniform1f
OpenGL Error 0x502
1.5f
誰かが私に説明してくれることを本当に願っています、これを成し遂げる方法。それは非常に基本的なことなので、ここで非常に明白な何かが欠けていると思います.