我遇到OpenGl ES 2.0的问题。我设计了一个非常简单的框架来帮助我加载OBJ文件并在我的Android手机上绘制它们,但我有2个我无法解决的错误:
在我更改方向并且活动被抓取并重新加载之前,我的应用程序没有显示任何内容。在重新加载之前,只能看到GLES20.glClear()(我将其设置为浅灰色)。
有时当我加载OBJ并执行方向操作时,我的一半脸部缺失,我看到了间隙,但问题可能出在我使用的OBJ文件上。
package com.ideas.opengl;
import java.io.IOException;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.Matrix;
public class DemoRenderer implements Renderer {
public static int mProgramHandle;
private int mMVPMatrixHandle;
private float[] mModelMatrix = new float[16];
private float[] mViewMatrix = new float[16];
private float[] mProjectionMatrix = new float[16];
private float[] mMVPMatrix = new float[16];
public Object banana;
private OpenGLDemoActivity activity;
private int angle;
public DemoRenderer(OpenGLDemoActivity activity) throws IOException {
this.activity = activity;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config){
GLES20.glClearColor(0.65f, 0.65f, 0.65f, 0.65f);
//GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);
Shader shader = null;
try {
shader = new Shader(activity, "simple");
} catch (IOException e) {
e.printStackTrace();
}
Vector position = new Vector();
Vector speed = new Vector();
Vector accel = new Vector();
Model model = null;
try {
model = new Model("banana", activity);
} catch (IOException e) {
e.printStackTrace();
}
banana = new Object(position, speed, accel, model);
mProgramHandle = shader.getProgramHandle();
final float eyeX = 0.0f;
final float eyeY = 0.0f;
final float eyeZ = 3.5f;
final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = -5.0f;
final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0, 0, width, height);
final float ratio = (float) width / height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1.0f;
final float top = 1.0f;
final float near = 1.0f;
final float far = 10.0f;
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
}
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
angle++;
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, angle, 0.0f, 1.0f, 1.0f);
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
banana.draw();
}
}
`
答案 0 :(得分:1)
尝试了一些glGetError()并得到了错误,一个关于一个变量值不变的变量,另一个是glGetAttributeLocation()如果在顶点着色器中没有使用该属性则返回-1。多克斯寻求帮助!
答案 1 :(得分:1)
几何的问题可能是由于在矩阵乘法中使用相同的float数组进行输入和输出:
angular.forEach(destinations,function(value) {
//here value is equal to one elment of your array
alert(value);
);
根据multiplyMM()规范,输入和输出数组可能没有重叠元素,但你使用相同的数组mMVPMatrix从相同的索引0开始。解决问题的一种方法是使用另一个矩阵作为缓冲区的结果最后一次乘法,而不是:
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
使用:
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);