0
我试图绘制画面合成和ortographic预测与“Matrix.setLookAtM”投影在一个简单的三角形,但它不是渲染它。在Android上的OpenGL ES 2.0 - Ortographic和setLookAt矩阵一起
我试过很多的组合与思考什么可能是错误的,但并没有解决问题。我认为矩阵乘法语法也很好(如果我将“a_Vision”设置为单位矩阵,那么也会呈现三角形)。
我想他们我错过任何概念的想法。
另外,我要乘 “a_Vision” X “a_OrtographicProjection” 或 “a_OrtographicProjection” X “a_Vision”?
代码如下。
package com.opengl01_themostbasic;
import static android.opengl.GLES20.GL_FLOAT;
import static android.opengl.GLES20.GL_TRIANGLES;
import static android.opengl.GLES20.glDrawArrays;
import static android.opengl.GLES20.glUniform4f;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.Matrix;
public class RendererClass implements Renderer {
int shaderProgram;
int variableToSayWhereTheVertexShaderShouldFindInformation;
int variableToSayWhereTheFragmentShaderShouldFindInformation;
int variableToSayWhereTheMatrixShouldFindInformation;
int BYTES_PER_FLOAT = 4;
FloatBuffer vertexData;
float[] a_OrtographicProjection = new float[16];
float[] a_Vision = new float[16];
float[] a_sTemp = new float[16];
float[] a_Result = new float[16];
public RendererClass(Context context){
float[] myVertices = {
// X, Y, Z
-8f, 8f, -2f,
0f, -4f, -2f,
5f, 3f, -2f
};
ByteBuffer intermediateBuffer = ByteBuffer.allocateDirect(myVertices.length*BYTES_PER_FLOAT);
intermediateBuffer.order(ByteOrder.nativeOrder());
vertexData = intermediateBuffer.asFloatBuffer();
vertexData.put(myVertices);
}
@Override
public void onSurfaceCreated(GL10 arg0, EGLConfig config) {
GLES20.glClearColor(0.4f, 0.5f, 0.8f, 1.0f);
String vertexShaderCode = "attribute vec4 myVertexPositionInsideOpenGL;"
+ "uniform mat4 a_Result;"
+ "void main(){"
+ "gl_Position = a_Result*myVertexPositionInsideOpenGL;"
+ "}";
String fragmentShaderCode = "precision mediump float;"
+ "uniform vec4 myColorsInsideOpenGL;"
+ "void main(){"
+ "gl_FragColor = myColorsInsideOpenGL;"
+ "}";
int vertexShaderID = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
int fragmentShaderID = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
GLES20.glShaderSource(vertexShaderID, vertexShaderCode);
GLES20.glShaderSource(fragmentShaderID, fragmentShaderCode);
GLES20.glCompileShader(vertexShaderID);
GLES20.glCompileShader(fragmentShaderID);
shaderProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(shaderProgram, vertexShaderID);
GLES20.glAttachShader(shaderProgram, fragmentShaderID);
GLES20.glLinkProgram(shaderProgram);
GLES20.glUseProgram(shaderProgram);
variableToSayWhereTheVertexShaderShouldFindInformation = GLES20.glGetAttribLocation(shaderProgram, "myVertexPositionInsideOpenGL");
variableToSayWhereTheFragmentShaderShouldFindInformation = GLES20.glGetUniformLocation(shaderProgram, "myColorsInsideOpenGL");
variableToSayWhereTheMatrixShouldFindInformation = GLES20.glGetUniformLocation(shaderProgram, "a_Result");
GLES20.glEnableVertexAttribArray(variableToSayWhereTheVertexShaderShouldFindInformation);
vertexData.position(0);
GLES20.glVertexAttribPointer(variableToSayWhereTheVertexShaderShouldFindInformation, 3, GL_FLOAT, false, 0, vertexData);
}
@Override
public void onSurfaceChanged(GL10 arg0, int width, int height) {
Matrix.orthoM(a_OrtographicProjection, 0, -20, 20, -20, 20, 2, -4);
Matrix.setLookAtM(a_Vision, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0);
Matrix.multiplyMM(a_sTemp, 0, a_Vision, 0, a_OrtographicProjection, 0);
System.arraycopy(a_sTemp, 0, a_Result, 0, a_sTemp.length);
}
@Override
public void onDrawFrame(GL10 glUnused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glUniformMatrix4fv(variableToSayWhereTheMatrixShouldFindInformation, 1, false, a_Result, 0);
glUniform4f(variableToSayWhereTheFragmentShaderShouldFindInformation, 1.0f, 0.0f, 1.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
}
这些变化制定出适合你?没有任何区别。 –
这是“暂定”:) – miguelao