Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL ES 2投影切换前景和背景_Android_Opengl Es_Opengl Es 2.0 - Fatal编程技术网

Android OpenGL ES 2投影切换前景和背景

Android OpenGL ES 2投影切换前景和背景,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我有一个包含地形图顶点高度的数组。 当我第一次绘制地形时,它看起来很好: 但当我沿z轴旋转它时,部分形状似乎投影到背面顶点的后面: 90度旋转(z轴): 约180度旋转(z轴): 除了映射的实现之外,我的代码也相当简单: 顶点着色器: attribute vec4 position; attribute vec4 color; uniform mat4 matrix; varying vec4 interpolated_color; void main() { gl_Posit

我有一个包含地形图顶点高度的数组。 当我第一次绘制地形时,它看起来很好:

但当我沿z轴旋转它时,部分形状似乎投影到背面顶点的后面:

90度旋转(z轴):

约180度旋转(z轴):

除了映射的实现之外,我的代码也相当简单:

顶点着色器:

attribute vec4 position;
attribute vec4 color;

uniform mat4 matrix;
varying vec4 interpolated_color;

void main() {
    gl_Position = matrix * position;
    interpolated_color = color;
}
片段着色器:

precision mediump float;

varying vec4 interpolated_color;

void main(){
   gl_FragColor = interpolated_color;
}
渲染器:

public class MapRenderer implements GLSurfaceView.Renderer {

    ...

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        GLES20.glClearColor(1.0f, 0.0f,0.0f, 1.0f);
        map = mapGen.composeMap(); //gets array with vertices heights
        mapView = new MapView(context, map, mapGen);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
        float aspect_ratio = (float) width/height;
        Matrix.perspectiveM(projectionMatrix, 0, 45, aspect_ratio, 1f, 10f);
    }


    @Override
    public void onDrawFrame(GL10 gl) {
        float[] scratch = new float[16];

        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

        Matrix.setIdentityM(modelMatrix, 0);

        Matrix.translateM(modelMatrix, 0, 0, 0, -4);
        Matrix.rotateM(modelMatrix, 0, -cameraAngle, 1, 0, 0); //cameraAngle initialized at 0 changes with user input
        Matrix.rotateM(modelMatrix, 0, mapAngle, 0, 0, 1); //mapAngle initialized at 0 changes with user input

        Matrix.multiplyMM(scratch, 0, projectionMatrix, 0, modelMatrix, 0);

        mapView.draw(scratch);
    }
}
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        GLES20.glClearColor(1.0f, 0.0f,0.0f, 1.0f);

        GLES20.glEnable(GLES20.GL_DEPTH_TEST);

        map = mapGen.composeMap(); //gets array with vertices heights
        mapView = new MapView(context, map, mapGen);
    }
地图视图类:

    public void draw(float[] mvpMatrix){
        int matrix = GLES20.glGetUniformLocation(program, "matrix");

        GLES20.glUniformMatrix4fv(matrix, 1, false, mvpMatrix, 0);

        //nFaces and facesBuffer are class variables
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, nFaces*3, GLES20.GL_UNSIGNED_SHORT, facesBuffer);
    }
我试着打开和关闭面部剔除,看看是否有任何差异发生,但都没有。 除了改变误差开始出现的角度外,改变投影矩阵似乎也没有任何影响。当使用
矩阵.perspective m
时,它似乎发生在约90度和高达约270度的位置,而当使用
矩阵.orthoM
时,它正好发生在90度和270度的位置

我还通过
glGetErrors()
方法检查了OpenGL是否返回了任何错误,但没有得到任何结果


我的顶点在缓冲区中按顺序排序,从位于(-1,1,0)的顶点到位于(1,-1,0)的最后一个顶点。我不知道这是否会导致这个问题,或者,即使是这样,我如何在OpenGL ES 2中解决这个问题,以支持沿z轴旋转。

需要启用深度测试,以便OpenGL将距离考虑在内

在渲染器上:

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

        GLES20.glEnable(GLES20.GL_DEPTH_TEST);

        map = mapGen.composeMap(); //gets array with vertices heights
        mapView = new MapView(context, map, mapGen);
    }