[英]Unable to draw a triangle by using opengl es 2.0 in android java
我正在通过参考主题为使用OpenGL ES 2.0显示图形的android的developer.android.com教程制作一个应用程序。 我使用了网站上提供的代码,但问题是我的应用程序没有显示三角形,而是先显示空白屏幕,然后崩溃,并显示“不幸的是,Graphics已经停止工作” Graphics是我的应用程序的名称。 我想知道我的代码在哪里造成问题。 我的代码是。
MainActivity.java:-
package com.example.graphics;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {
private GLSurfaceView gv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv=new MyGLSurfaceView(this);
setContentView(gv);
}
}
MyGLSurfaceView.java:-
package com.example.graphics;
import android.content.Context;
import android.opengl.GLSurfaceView;
class MyGLSurfaceView
extends GLSurfaceView{
public MyGLSurfaceView(Context context) {
super(context);
setRenderer(new MyGLRenderer());
setEGLContextClientVersion(2);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
}
Triangle.java:-
package com.example.graphics;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;
public class Triangle {
private FloatBuffer mFloatBuffer;
int COORDS_PER_VERTEX=3;
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };
float[] coords={
0.0f,0.5f,0.0f
,-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f
};
private final String vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = vPosition;" +
"}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";
int mPositionHandle,mColorHandle;
int mProgram;
MyGLRenderer g=new MyGLRenderer();
private int vertexStride=COORDS_PER_VERTEX*4;
private int vertexCount=coords.length/COORDS_PER_VERTEX;
public Triangle() {
// TODO Auto-generated constructor stub
int vertexShader=g.loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);
int fragmentShader=g.loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);
mProgram=GLES20.glCreateProgram();
GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glAttachShader(mProgram, fragmentShader);
GLES20.glLinkProgram(mProgram);
ByteBuffer bb=ByteBuffer.allocateDirect(coords.length*4);
bb.order(ByteOrder.nativeOrder());
mFloatBuffer=bb.asFloatBuffer();
mFloatBuffer.put(coords);
mFloatBuffer.position(0);
}
public void draw()
{
GLES20.glUseProgram(mProgram);
mPositionHandle=GLES20.glGetAttribLocation(mProgram, "vPosition");
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, mFloatBuffer);
mColorHandle=GLES20.glGetUniformLocation(mProgram, "vColor");
GLES20.glUniform4fv(mColorHandle, 0, color,1);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
}
MyGLRenderer.java:-
package com.example.graphics;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
class MyGLRenderer
implements GLSurfaceView.Renderer{
Triangle mTri;
@Override
public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
// TODO Auto-generated method stub
mTri=new Triangle();
}
public void onDrawFrame(GL10 arg0) {
// TODO Auto-generated method stub
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT);
mTri.draw();
}
@Override
public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
public int loadShader(int type,String shaderSource)
{
int shader=GLES20.glCreateShader(type);
GLES20.glShaderSource(shader, shaderSource);
GLES20.glCompileShader(shader);
return shader;
}
}
最后亩清单是:-GraphicsManifest.xml:-
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.graphics"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="20" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
告诉我我在哪里做错了。 以及为什么我的应用程序崩溃。
这段代码至少有两个问题。 最重要的是一开始:
public MyGLSurfaceView(Context context) {
super(context);
setRenderer(new MyGLRenderer());
setEGLContextClientVersion(2);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
这是错误的呼叫顺序。 需要在 setRenderer()
之前调用setEGLContexClientVersion()
setRenderer()
。 setRenderer()
启动选择配置并创建上下文,这都取决于API版本。 正确的顺序是:
public MyGLSurfaceView(Context context) {
super(context);
setEGLContextClientVersion(2);
setRenderer(new MyGLRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
另一个问题是此调用:
GLES20.glUniform4fv(mColorHandle, 0, color,1);
第二个参数是count
,它是要设置的向量数。 由于为此参数传递的值为0
,因此将完全不执行任何操作。 另一方面,最后一个参数是作为第3个参数传递的向量的偏移量,在这种情况下应为0
。 正确的呼叫是:
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
我没有详细研究所有代码,但是这些都是立即跳出来的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.