編集:右、修正しました:D 問題は、glUseProgram() を呼び出す前に射影行列を設定しようとしていたことでした
私は Android で GL ES 2.0 から始めて、コードの一部を 1.1 から移行しようとしています。公式ドキュメントに従って頂点シェーダーとフラグメント シェーダーを定義しました。一緒に作業しますが、空白の画面しか表示されないようです。
モデル ビュー マトリックスを頂点シェーダーに渡し、結果の mvp マトリックスに頂点位置を掛ける前にオルソ投影を掛けています。明確にするためのシェーダーは次のとおりです。
頂点シェーダー
attribute vec3 Position;
uniform mat4 Projection;
uniform mat4 ModelView;
void main() {
mat4 mvp = Projection * ModelView;
gl_Position = mvp * vec4(Position.xyz, 1);
}
フラグメント シェーダー
precision mediump float;
uniform vec4 Color;
void main() {
gl_FragColor = Color;
}
レンダラーの onSurfaceChangedFunction() で射影行列を構築しています。
int projectionHandle = GLES20.glGetUniformLocation(shaderProg, "Projection");
Matrix.orthoM(projection, 0, -width / 2, width / 2, -height / 2, height / 2, -10, 10);
GLES20.glUniformMatrix4fv(projectionHandle, 1, false, projection, 0);
次に onDrawFrame() で、各アクターの描画ルーチンを呼び出します。
nt positionHandle = GLES20.glGetAttribLocation(Renderer.getShaderProg(), "Position");
nt colorHandle = GLES20.glGetAttribLocation(Renderer.getShaderProg(), "Color");
nt modelHandle = GLES20.glGetUniformLocation(Renderer.getShaderProg(), "ModelView");
float[] modelView = new float[16];
Matrix.setIdentityM(modelView, 0);
Matrix.rotateM(modelView, 0, rotation, 0, 0, 1.0f);
Matrix.translateM(modelView, 0, position.x, position.y, 1.0f);
GLES20.glUniformMatrix4fv(modelHandle, 1, false, modelView, 0);
GLES20.glUniform4fv(colorHandle, 1, color.toFloatArray(), 0);
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 0, vertBuffer);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
GLES20.glDisableVertexAttribArray(positionHandle);
これを少し最適化できることはわかっていますが、最初に機能させたいだけです。頂点は FloatBuffer にあり、原点を中心にしています。私が間違っていることについて何か考えはありますか?私は自分のコードをさまざまなチュートリアルや SO の質問/回答と照らし合わせてチェックしてきましたが、何が間違っているのかわかりません。