1

我试图从http://developer.android.com/resources/tutorials/opengl/opengl-es20.html做教程 但我想要的是在多个类中创建它以便于编辑。我的问题是 eclipse 没有显示任何类型的错误或问题,应用程序运行但仅显示白色背景(未显示三角形)并且 logcat 不断抛出错误“称为未实现的 OpenGL ES API”。我不知道我做错了什么,并且 Eclipse 没有告诉我错误在哪里,有人可以告诉我出了什么问题,或者至少让我走上解决方案的轨道吗?

编辑:我使用 android 2.3.7 在 htc 上运行这个应用程序。当我从谷歌教程复制粘贴代码时,一切都运行得很好。

我的课程看起来像这样:

活动:

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class Androdvlpr2Activity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    GLSurfaceView View = new GLSurfaceView(this);
    View.setRenderer(new Renderer());
    setContentView(View);
}
}

渲染器:

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

public class Renderer implements GLSurfaceView.Renderer {
Triangle triangle = new Triangle();
private int mProgram;
private int maPositionHandle;

public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    GLES20.glClearColor(0.92f, 0.92f, 0.92f, 1.0f);

    Triangle.initTriangle();


    mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
    GLES20.glAttachShader(mProgram, Shader.vertexShader);   // add the vertex shader to program
    GLES20.glAttachShader(mProgram, Shader.fragmentShader); // add the fragment shader to program
    GLES20.glLinkProgram(mProgram);                  // creates OpenGL program executables

    // get handle to the vertex shader's vPosition member
    maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
}

public void onDrawFrame(GL10 unused) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);


    GLES20.glUseProgram(mProgram);
    // Prepare the triangle data
    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 12, Triangle.verticesBuffer);
    GLES20.glEnableVertexAttribArray(maPositionHandle);
    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
}

public void onSurfaceChanged(GL10 unused, int width, int height) {
}  
}

三角形:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

public class Triangle {
static FloatBuffer verticesBuffer = null;

public static void initTriangle(){
    float triangleCoords[] = {
                // X, Y, Z
                -0.5f, -0.25f, 0,
                 0.5f, -0.25f, 0,
                 0.0f,  0.559016994f, 0
            }; 

    ByteBuffer vbb = ByteBuffer.allocateDirect(triangleCoords.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    verticesBuffer = vbb.asFloatBuffer();
    verticesBuffer.put(triangleCoords);
    verticesBuffer.position(0);
}
}

着色器:

import android.opengl.GLES20;

public class Shader {
    private final static String vertexShaderCode = 
        "attribute vec4 vPosition; \n" +
        "void main(){              \n" +
        " gl_Position = vPosition; \n" +
        "}                         \n";

    private final static String fragmentShaderCode = 
        "precision mediump float;  \n" +
        "void main(){              \n" +
        " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n" +
        "}                         \n";

    final static int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
    final static int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

private static int loadShader(int type, String shaderCode){

    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    int shader = GLES20.glCreateShader(type); 

    // add the source code to the shader and compile it
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);

    return shader;
}
}
4

1 回答 1

1

在里面onSurfaceChanged,必须设置视口。

在每次OpenGL 调用后检查错误!我曾经在自定义 ROM 中看到过一些未实现的警告;你想追踪到底是哪些电话引发了这些。

于 2012-05-07T12:15:30.233 回答