Android 如何在openGL Es第一次绘制对象时确定相机的坐标
我从blender加载了一个模型,我试图在openGL中加载它,但它显示了一个黑色窗口。我猜我的相机放错位置了,所以我什么也看不见。问题是我不知道把相机放在哪里,也不知道把投影矩阵放在哪里 我的渲染器的代码:Android 如何在openGL Es第一次绘制对象时确定相机的坐标,android,opengl-es,3d,Android,Opengl Es,3d,我从blender加载了一个模型,我试图在openGL中加载它,但它显示了一个黑色窗口。我猜我的相机放错位置了,所以我什么也看不见。问题是我不知道把相机放在哪里,也不知道把投影矩阵放在哪里 我的渲染器的代码: public RocketArrowRenderer(Context context) { mContext = context; Resources res = mContext.getResources(); InputStrea
public RocketArrowRenderer(Context context)
{
mContext = context;
Resources res = mContext.getResources();
InputStream inputStream = res.openRawResource(R.raw.rocket_obj);
Obj obj = null;
try {
obj = ObjUtils.convertToRenderable(ObjReader.read(inputStream));
} catch (IOException e) {
e.printStackTrace();
}
IntBuffer indices = ObjData.getFaceVertexIndices(obj);
mVertices = ObjData.getVertices(obj);
//FloatBuffer texCoords = ObjData.getTexCoords(obj, 2);
//FloatBuffer normals = ObjData.getNormals(obj);
}
@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
if (vertexShaderHandle != 0)
{
GLES20.glShaderSource(vertexShaderHandle, vertexShader);
GLES20.glCompileShader(vertexShaderHandle);
final int[] compileStatus = new int[1];
GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
if (compileStatus[0] == 0)
{
GLES20.glDeleteShader(vertexShaderHandle);
vertexShaderHandle = 0;
}
}
if (vertexShaderHandle == 0)
{
throw new RuntimeException("Error creating vertex shader.");
}
// Load in the vertex shader.
int fragmentShaderHandle = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
if(fragmentShader != null){
GLES20.glShaderSource(fragmentShaderHandle, fragmentShader);
GLES20.glCompileShader(fragmentShaderHandle);
final int[] compileStatus2 = new int[1];
GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus2, 0);
if(compileStatus2[0] == 0){
GLES20.glDeleteShader(fragmentShaderHandle);
fragmentShaderHandle = 0;
}
}
if(fragmentShader == null){
throw new RuntimeException("Error creating fragment shader");
}
int programHandle = GLES20.glCreateProgram();
if (programHandle != 0)
{
GLES20.glAttachShader(programHandle, vertexShaderHandle);
GLES20.glAttachShader(programHandle, fragmentShaderHandle);
GLES20.glBindAttribLocation(programHandle, 0, "a_Position");
GLES20.glBindAttribLocation(programHandle, 1, "a_Color");
GLES20.glLinkProgram(programHandle);
final int[] linkStatus = new int[1];
GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, linkStatus, 0);
if (linkStatus[0] == 0)
{
GLES20.glDeleteProgram(programHandle);
programHandle = 0;
}
}
if (programHandle == 0) {
throw new RuntimeException("Error creating program.");
}
mMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");
mPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position");
GLES20.glUseProgram(programHandle);
}
private float[] mProjectionMatrix = new float[16];
@Override
public void onSurfaceChanged(GL10 glUnused, 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 glUnused)
{
AsyncTask<RocketArrowRenderer, Void, Void> handle = new AsyncTask<RocketArrowRenderer, Void, Void>() {
@Override
protected Void doInBackground(RocketArrowRenderer... renderers) {
renderers[0].draw();
return null;
}
};
handle.execute(this);
}
public void draw() {
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
Matrix.setIdentityM(mModelMatrix, 0);
int numberOfTriangles = mVertices.position(0).remaining() / 3;
mVertices.position(mPositionOffset);
GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
0, mPositionOffset);
GLES20.glEnableVertexAttribArray(mPositionHandle);
//and later, in draw
GLES20.glUniform4f(mColorHandle, 1.0f, 0.0f, 0.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);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numberOfTriangles);
}
}
公共RocketArrowRenderer(上下文)
{
mContext=上下文;
Resources res=mContext.getResources();
InputStream InputStream=res.openRawResource(R.raw.rocket_obj);
Obj Obj=null;
试一试{
obj=ObjUtils.convertToRenderable(ObjReader.read(inputStream));
}捕获(IOE异常){
e、 printStackTrace();
}
IntBuffer index=ObjData.getfacevertexins(obj);
mVertices=ObjData.getVertices(obj);
//FloatBuffer texCoords=ObjData.getTexCoords(obj,2);
//FloatBuffer normals=ObjData.getNormals(obj);
}
@凌驾
已创建表面上的公共void(GL10 glUnused,EGLConfig配置){
GLES20.glClearColor(0.5f,0.5f,0.5f,0.5f);
矩阵setLookAtM(mViewMatrix,0,eyeX,eyeY,eyeZ,lookX,lookY,lookZ,upX,upY,upZ);
int vertexShaderHandle=GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
如果(vertexShaderHandle!=0)
{
GLES20.glShaderSource(vertexShaderHandle,vertexShader);
GLES20.glCompileShader(vertexShaderHandle);
final int[]compileStatus=new int[1];
GLES20.glGetShaderiv(vertexShaderHandle,GLES20.GLU编译状态,编译状态,0);
if(compileStatus[0]==0)
{
GLES20.glDeleteShader(vertexShaderHandle);
vertexShaderHandle=0;
}
}
如果(vertexShaderHandle==0)
{
抛出新的RuntimeException(“创建顶点着色器时出错”);
}
//加载顶点着色器。
int fragmentShaderHandle=GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
if(fragmentShader!=null){
GLES20.glShaderSource(fragmentShaderHandle,fragmentShader);
GLES20.glCompileShader(fragmentShaderHandle);
final int[]compileStatus2=新int[1];
GLES20.glGetShaderiv(vertexShaderHandle,GLES20.GLU编译状态,编译状态2,0);
if(compileStatus2[0]==0){
GLES20.glDeleteShader(fragmentShaderHandle);
fragmentShaderHandle=0;
}
}
如果(fragmentShader==null){
抛出新的RuntimeException(“创建片段着色器时出错”);
}
int programHandle=GLES20.glCreateProgram();
if(programHandle!=0)
{
GLES20.glAttachShader(程序句柄,vertexShaderHandle);
GLES20.glAttachShader(程序句柄、碎片着色器句柄);
GLES20.GLBindAttriblLocation(程序句柄,0,“a_位置”);
GLES20.glBindAttribLocation(programHandle,1,“a_颜色”);
GLES20.glLinkProgram(程序句柄);
最终整数[]链接状态=新整数[1];
GLES20.glGetProgramiv(程序句柄,GLES20.GLU链接状态,链接状态,0);
如果(链接状态[0]==0)
{
GLES20.glDeleteProgram(程序句柄);
programHandle=0;
}
}
if(programHandle==0){
抛出新的RuntimeException(“创建程序时出错”);
}
mMVPMatrixHandle=GLES20.glGetUniformLocation(programHandle,“u_MVPMatrix”);
mPositionHandle=GLES20.glGetAttriblLocation(programHandle,“a_位置”);
GLES20.glUseProgram(程序句柄);
}
私有浮动[]mProjectionMatrix=新浮动[16];
@凌驾
表面上的公共空隙已更改(GL10已涂胶、整型宽度、整型高度)
{
GLES20.glViewport(0,0,宽度,高度);
最终浮动比率=(浮动)宽度/高度;
最终浮动左=-比率;
最终浮动权=比率;
最终浮底=-1.0f;
最终浮顶=1.0f;
接近的最终浮动=1.0f;
最终浮动far=10.0f;
平截头体(mProjectionMatrix,0,左,右,下,上,近,远);
}
@凌驾
公共空间框架(GL10胶合)
{
AsyncTask句柄=新建AsyncTask(){
@凌驾
受保护的Void doInBackground(RocketArrowRenderer…渲染器){
渲染器[0]。绘制();
返回null;
}
};
处理,执行(这个);
}
公众抽签(){
GLES20.glClear(GLES20.GL_深度_缓冲_位| GLES20.GL_颜色_缓冲_位);
矩阵setIdentityM(mModelMatrix,0);
int numberOfTriangles=mVertices.position(0).remaining()/3;
垂直位置(位置偏移);
GLES20.glVertexAttribute指针(mPositionHandle、mPositionDataSize、GLES20.GL_FLOAT、false、,
0,mPositionOffset);
GLES20.GlenableVertexAttributeArray(mPositionHandle);
//后来,在平局中
GLES20.glUniform4f(McColorhandle,1.0f,0.0f,0.0f,1.0f);
多矩阵(mMVPMatrix,0,mViewMatrix,0,mModelMatrix,0);
multiplyMM(mMVPMatrix,0,mProjectionMatrix,0,mMVPMatrix,0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle,1,false,mMVPMatrix,0);
GLES20.GlDrawArray(GLES20.GL_三角形,0,numberOfTriangles);
}
}
显示代码。没有它,我们怎么知道到底出了什么问题?可能有很多东西。@meowgoesdog代码已上载。。