Android ';投影和摄像机视图';不起作用

Android ';投影和摄像机视图';不起作用,android,opengl-es-2.0,Android,Opengl Es 2.0,我目前正在学习关于OpenGL的教程,但它只显示背景色 在本教程之前,三角形已成功绘制 GLRenderer.java public class GLRenderer implements GLSurfaceView.Renderer { private final float[] MVPMatrix = new float[16]; private final float[] projectionMatrix = new float[16]; private final

我目前正在学习关于OpenGL的教程,但它只显示背景色

在本教程之前,三角形已成功绘制

GLRenderer.java

public class GLRenderer implements GLSurfaceView.Renderer
{
    private final float[] MVPMatrix = new float[16];
    private final float[] projectionMatrix = new float[16];
    private final float[] viewMatrix = new float[16];

    private Triangle triangle;

    @Override
    public void onSurfaceCreated(GL10 p1, javax.microedition.khronos.egl.EGLConfig p2)
    {
        // TODO: Implement this method
        GLES20.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); // RGBA, gives a dark gray background color
        triangle = new Triangle();
    }

    @Override
    public void onSurfaceChanged(GL10 p1, int w, int h)
    {
        // TODO: Implement this method

        GLES20.glViewport(0, 0, w, h);

        float ratio = (float) w / h;

        Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

    }

    @Override
    public void onDrawFrame(GL10 p1)
    {
        // TODO: Implement this method
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // clears the screen

        Matrix.setLookAtM(viewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
        Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
        triangle.draw(MVPMatrix);
    }

    public static int loadShader(int type, String shaderCode)
    {
        int shader = GLES20.glCreateShader(type);

        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);

        return shader;
    }
}
public class Triangle
{

    private FloatBuffer vertexBuffer;
    private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "void main(){" +
        "   gl_Position = uMVPMatrix * vPosition;" +
        "}";

    private final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "void main() {" +
        "   gl_FragColor = vColor;" +
        "}";

    static final int COORDS_PER_VERTEX = 3;
    static float TRIANGLE_COORDS[] = {
        0.0f, 0.6f, 0.0f, // top
        -0.5f, -0.3f, 0.0f, // bottom left
        0.5f, -0.3f, 0.0f // bottom right
    };

    float color[] = {0.8f, 0.8f, 0.8f, 1.0f}; // RGBA, default gray color

    private final int glProgram;

    private int positionHandle;
    private int colorHandle;
    private int MVPMatrixHandle;

    private final int vertexCount = TRIANGLE_COORDS.length / COORDS_PER_VERTEX;
    private final int vertexStride = COORDS_PER_VERTEX * 4;

    public Triangle()
    {
        ByteBuffer bb = ByteBuffer.allocateDirect(TRIANGLE_COORDS.length * 4);
        bb.order(ByteOrder.nativeOrder());

        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(TRIANGLE_COORDS);
        vertexBuffer.position(0);

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

        glProgram = GLES20.glCreateProgram();

        GLES20.glAttachShader(glProgram, vertexShader);
        GLES20.glAttachShader(glProgram, fragmentShader);
        GLES20.glLinkProgram(glProgram);
    }

    public void draw(float[] mvpMatrix)
    {
        GLES20.glUseProgram(glProgram);

        positionHandle = GLES20.glGetAttribLocation(glProgram, "vPosition");

        GLES20.glEnableVertexAttribArray(positionHandle);

        GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);

        colorHandle = GLES20.glGetUniformLocation(glProgram, "vColor");
        GLES20.glUniform4fv(colorHandle, 1, color, 0);

        MVPMatrixHandle = GLES20.glGetUniformLocation(glProgram, "uMVPMatrix");
        GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0); 
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        GLES20.glDisableVertexAttribArray(positionHandle);
    }
}
    public class GLView extends GLSurfaceView
{
    public GLView (Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setEGLContextClientVersion(2); // Checking for OpenGL versions (1.1, 2.0, 3.0, and 3.1) in later versions
        GLRenderer glRenderer = new GLRenderer();
        setRenderer(glRenderer);

        setRenderMode(RENDERMODE_WHEN_DIRTY);
        requestRender();
    }
}
Triangle.java

public class GLRenderer implements GLSurfaceView.Renderer
{
    private final float[] MVPMatrix = new float[16];
    private final float[] projectionMatrix = new float[16];
    private final float[] viewMatrix = new float[16];

    private Triangle triangle;

    @Override
    public void onSurfaceCreated(GL10 p1, javax.microedition.khronos.egl.EGLConfig p2)
    {
        // TODO: Implement this method
        GLES20.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); // RGBA, gives a dark gray background color
        triangle = new Triangle();
    }

    @Override
    public void onSurfaceChanged(GL10 p1, int w, int h)
    {
        // TODO: Implement this method

        GLES20.glViewport(0, 0, w, h);

        float ratio = (float) w / h;

        Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

    }

    @Override
    public void onDrawFrame(GL10 p1)
    {
        // TODO: Implement this method
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // clears the screen

        Matrix.setLookAtM(viewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
        Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
        triangle.draw(MVPMatrix);
    }

    public static int loadShader(int type, String shaderCode)
    {
        int shader = GLES20.glCreateShader(type);

        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);

        return shader;
    }
}
public class Triangle
{

    private FloatBuffer vertexBuffer;
    private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "void main(){" +
        "   gl_Position = uMVPMatrix * vPosition;" +
        "}";

    private final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "void main() {" +
        "   gl_FragColor = vColor;" +
        "}";

    static final int COORDS_PER_VERTEX = 3;
    static float TRIANGLE_COORDS[] = {
        0.0f, 0.6f, 0.0f, // top
        -0.5f, -0.3f, 0.0f, // bottom left
        0.5f, -0.3f, 0.0f // bottom right
    };

    float color[] = {0.8f, 0.8f, 0.8f, 1.0f}; // RGBA, default gray color

    private final int glProgram;

    private int positionHandle;
    private int colorHandle;
    private int MVPMatrixHandle;

    private final int vertexCount = TRIANGLE_COORDS.length / COORDS_PER_VERTEX;
    private final int vertexStride = COORDS_PER_VERTEX * 4;

    public Triangle()
    {
        ByteBuffer bb = ByteBuffer.allocateDirect(TRIANGLE_COORDS.length * 4);
        bb.order(ByteOrder.nativeOrder());

        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(TRIANGLE_COORDS);
        vertexBuffer.position(0);

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

        glProgram = GLES20.glCreateProgram();

        GLES20.glAttachShader(glProgram, vertexShader);
        GLES20.glAttachShader(glProgram, fragmentShader);
        GLES20.glLinkProgram(glProgram);
    }

    public void draw(float[] mvpMatrix)
    {
        GLES20.glUseProgram(glProgram);

        positionHandle = GLES20.glGetAttribLocation(glProgram, "vPosition");

        GLES20.glEnableVertexAttribArray(positionHandle);

        GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);

        colorHandle = GLES20.glGetUniformLocation(glProgram, "vColor");
        GLES20.glUniform4fv(colorHandle, 1, color, 0);

        MVPMatrixHandle = GLES20.glGetUniformLocation(glProgram, "uMVPMatrix");
        GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0); 
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        GLES20.glDisableVertexAttribArray(positionHandle);
    }
}
    public class GLView extends GLSurfaceView
{
    public GLView (Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setEGLContextClientVersion(2); // Checking for OpenGL versions (1.1, 2.0, 3.0, and 3.1) in later versions
        GLRenderer glRenderer = new GLRenderer();
        setRenderer(glRenderer);

        setRenderMode(RENDERMODE_WHEN_DIRTY);
        requestRender();
    }
}
我已经创建了一个自定义的
视图
,该视图将保存
GLSurfaceView
,以便我能够添加UI元素

这里有什么问题?我试图通过修改某些部分来调试它,但它们都显示相同的输出

编辑:

这是我创建的自定义
视图

GLView.java

public class GLRenderer implements GLSurfaceView.Renderer
{
    private final float[] MVPMatrix = new float[16];
    private final float[] projectionMatrix = new float[16];
    private final float[] viewMatrix = new float[16];

    private Triangle triangle;

    @Override
    public void onSurfaceCreated(GL10 p1, javax.microedition.khronos.egl.EGLConfig p2)
    {
        // TODO: Implement this method
        GLES20.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); // RGBA, gives a dark gray background color
        triangle = new Triangle();
    }

    @Override
    public void onSurfaceChanged(GL10 p1, int w, int h)
    {
        // TODO: Implement this method

        GLES20.glViewport(0, 0, w, h);

        float ratio = (float) w / h;

        Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

    }

    @Override
    public void onDrawFrame(GL10 p1)
    {
        // TODO: Implement this method
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // clears the screen

        Matrix.setLookAtM(viewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
        Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
        triangle.draw(MVPMatrix);
    }

    public static int loadShader(int type, String shaderCode)
    {
        int shader = GLES20.glCreateShader(type);

        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);

        return shader;
    }
}
public class Triangle
{

    private FloatBuffer vertexBuffer;
    private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "void main(){" +
        "   gl_Position = uMVPMatrix * vPosition;" +
        "}";

    private final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "void main() {" +
        "   gl_FragColor = vColor;" +
        "}";

    static final int COORDS_PER_VERTEX = 3;
    static float TRIANGLE_COORDS[] = {
        0.0f, 0.6f, 0.0f, // top
        -0.5f, -0.3f, 0.0f, // bottom left
        0.5f, -0.3f, 0.0f // bottom right
    };

    float color[] = {0.8f, 0.8f, 0.8f, 1.0f}; // RGBA, default gray color

    private final int glProgram;

    private int positionHandle;
    private int colorHandle;
    private int MVPMatrixHandle;

    private final int vertexCount = TRIANGLE_COORDS.length / COORDS_PER_VERTEX;
    private final int vertexStride = COORDS_PER_VERTEX * 4;

    public Triangle()
    {
        ByteBuffer bb = ByteBuffer.allocateDirect(TRIANGLE_COORDS.length * 4);
        bb.order(ByteOrder.nativeOrder());

        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(TRIANGLE_COORDS);
        vertexBuffer.position(0);

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

        glProgram = GLES20.glCreateProgram();

        GLES20.glAttachShader(glProgram, vertexShader);
        GLES20.glAttachShader(glProgram, fragmentShader);
        GLES20.glLinkProgram(glProgram);
    }

    public void draw(float[] mvpMatrix)
    {
        GLES20.glUseProgram(glProgram);

        positionHandle = GLES20.glGetAttribLocation(glProgram, "vPosition");

        GLES20.glEnableVertexAttribArray(positionHandle);

        GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);

        colorHandle = GLES20.glGetUniformLocation(glProgram, "vColor");
        GLES20.glUniform4fv(colorHandle, 1, color, 0);

        MVPMatrixHandle = GLES20.glGetUniformLocation(glProgram, "uMVPMatrix");
        GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0); 
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        GLES20.glDisableVertexAttribArray(positionHandle);
    }
}
    public class GLView extends GLSurfaceView
{
    public GLView (Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setEGLContextClientVersion(2); // Checking for OpenGL versions (1.1, 2.0, 3.0, and 3.1) in later versions
        GLRenderer glRenderer = new GLRenderer();
        setRenderer(glRenderer);

        setRenderMode(RENDERMODE_WHEN_DIRTY);
        requestRender();
    }
}

您在本教程中具体更改了哪些代码?此外,您还将SurfaceView设置为仅在需要时渲染,而不请求渲染。我将GLSurfaceView设置为RENDERMODE_when_DIRTY,教程中的大多数代码没有更改,只有一些变量名。我只是想创建一个保存GLSurfaceView的自定义视图,以便仍然可以包含其他UI元素。上面的代码是完整的未更改代码。您正在调用
requestRender()
?是的,在我创建的自定义视图中。但我还是得到了同样的结果。我应该把它放在哪里?您放在了正确的位置-每次要渲染帧时都应该从视图中调用它。问题出在别的地方。