java – Android的OpenGL ES教程似乎不起作用

我一直在为 Android上的OpenGL ES在 http://developer.android.com/resources/tutorials/opengl/opengl-es20.html的教程.我已经得到了“应用投影和相机视图”部分,但是我总是似乎得到一个没有三角形的空白屏幕,上一节工作得很好.我也尝试只是复制粘贴整个教程到我的代码,但得到相同的结果.改变行:
gl_Position = uMVPMatrix * vPosition;

至:

gl_Position = vPosition;

将应用程序放回第一部分(根据屏幕方向,三角形延伸).任何想法是什么问题?这是我到目前为止的代码,以防万一我错过了一些东西:

public class GLTest20Renderer implements Renderer {
    private final String vertexShaderCode = 
        // This matrix member variable provides a hook to manipulate
        // the coordinates of the objects that use this vertex shader
        "uniform mat4 uMVPMatrix;   n" +

        "attribute vec4 vPosition;  n" +
        "void main(){               n" +

        // the matrix must be included as a modifier of gl_Position
        " gl_Position = uMVPMatrix * vPosition; n" +

        "}  n";

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


    private FloatBuffer triangleVB;

    private int mProgram;
    private int maPositionHandle;

    private int muMVPMatrixHandle;
    private float[] mMVPMatrix = new float[16];
    private float[] mMMatrix = new float[16];
    private float[] mVMatrix = new float[16];
    private float[] mProjMatrix = new float[16];

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

        initShapes();

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

        mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
        GLES20.glAttachShader(mProgram,vertexShader);   // add the vertex shader to program
        GLES20.glAttachShader(mProgram,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 );

        // Add program to OpenGL environment
        GLES20.glUseProgram(mProgram);

        // Prepare the triangle data
        GLES20.glVertexAttribPointer(maPositionHandle,3,GLES20.GL_FLOAT,false,12,triangleVB);
        GLES20.glEnableVertexAttribArray(maPositionHandle);

        // Apply a ModelView Projection transformation
        Matrix.multiplyMM(mMVPMatrix,mProjMatrix,mVMatrix,0);
        GLES20.glUniformMatrix4fv(muMVPMatrixHandle,1,mMVPMatrix,0);

        // Draw the triangle
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES,3);
    }

    public void onSurfaceChanged(GL10 unused,int width,int height) {
        GLES20.glViewport(0,width,height);

        float ratio = (float) width / height;

        Matrix.frustumM(mProjMatrix,-ratio,ratio,-1,7);

        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram,"uMVPMatrix");
        Matrix.setLookAtM(mVMatrix,-3,0f,1.0f,0.0f);
    }

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

        // initialize vertex Buffer for triangle  
        ByteBuffer vbb = ByteBuffer.allocateDirect(
                // (# of coordinate values * 4 bytes per float)
                triangleCoords.length * 4); 
        vbb.order(ByteOrder.nativeOrder());// use the device hardware's native byte order
        triangleVB = vbb.asFloatBuffer();  // create a floating point buffer from the ByteBuffer
        triangleVB.put(triangleCoords);    // add the coordinates to the FloatBuffer
        triangleVB.position(0);            // set the buffer to read the first coordinate
    }

    private 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;
    }
}

我正在三星Galaxy S2上运行所有这些.

解决方法

修正了,只是将观察点的近点改为3:
Matrix.frustumM(mProjMatrix,2,7);

以上是来客网为你收集整理的java – Android的OpenGL ES教程似乎不起作用全部内容,希望文章能够帮你解决java – Android的OpenGL ES教程似乎不起作用所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。