无法在android java中使用opengl es 2.0绘制三角形

无法在android java中使用opengl es 2.0绘制三角形,java,android,opengl-es,Java,Android,Opengl Es,我正在通过参考android的developer.android.com教程制作一个应用程序,该教程的主题是使用OpenGL ES 2.0显示图形。我使用了网站上给出的代码,但问题是,我的应用程序没有显示三角形,而是先显示空白屏幕,然后崩溃,不幸的是,图形已经停止工作 图形是我的应用程序的名称。 我想知道我的代码在哪里产生了问题。 我的密码是 MainActivity.java:- package com.example.graphics; import android.ope

我正在通过参考android的developer.android.com教程制作一个应用程序,该教程的主题是使用OpenGL ES 2.0显示图形。我使用了网站上给出的代码,但问题是,我的应用程序没有显示三角形,而是先显示空白屏幕,然后崩溃,不幸的是,图形已经停止工作 图形是我的应用程序的名称。 我想知道我的代码在哪里产生了问题。 我的密码是

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启动选择配置和创建上下文,两者都取决于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,所以这根本不起作用。另一方面,最后一个参数是作为第三个参数传递的向量的偏移量,在本例中应为0。正确的呼叫是:

GLES20.glUniform4fv(mColorHandle, 1, color, 0);

我没有详细研究所有的代码,但这些都是立即出现的问题。

您没有日志输出?这意味着什么???因为我是个新手,棘轮怪胎