1

我正在 Android 上的 3d 场景中开发相机系统。到目前为止,我使用这个初始化代码来:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.i(LOG_TAG, "onSurfaceCreated()");

        TextureLibrary.loadTextures(m_context, gl);

        //Set initial perspective and viewport
        gl.glMatrixMode(GL10.GL_PROJECTION); 
        float fov = .01f * (float) Math.tan(Math.toRadians(45.0 / 2.0));
        float aspectRatio = 1.9541f;
        gl.glFrustumf(-fov, fov, -fov / aspectRatio, fov / aspectRatio, 0.01f, 100.0f);
        gl.glViewport(0, 0, (int) _viewportWidth, (int) _viewportHeight);
        gl.glMatrixMode(GL10.GL_MODELVIEW);

        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_CULL_FACE);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glFrontFace(GL10.GL_CW);
        gl.glCullFace(GL10.GL_BACK);

        initialise();
    }

但现在,我想更新渲染方法中的截锥体,以执行缩放和/或图像失真。但是,它似乎是截锥体更新

这是渲染代码(去掉了一些胖子,除了通常的 Push 和 PopMatrix 之外,它不包含任何 GL 状态更改代码):

private void render(GL10 gl)
    {
      //Frustrum update code
        gl.glMatrixMode(GL10.GL_PROJECTION); 
        float fov = .01f * (float) Math.tan(Math.toRadians(45.0 / 2.0));
        float aspectRatio = 1.9541f;
        gl.glFrustumf(-fov, fov, -fov / aspectRatio, fov / aspectRatio, 0.01f, 100.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
        gl.glLoadIdentity();
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);         

       //Render all the things here!

        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }

如您所见,设置截锥体的片段几乎相同,使用的值也相同。但是,当在 render 方法中调用 glFrustum 时,程序不会显示任何正在绘制的内容。我觉得这很奇怪,因为使用的值完全相同(强制纵横比时)。

视口仍然在 OnSurfaceChanged 方法中设置/更新,该方法至少被命中一次。

public void onSurfaceChanged(GL10 gl, int width, int height) {
        _viewportWidth = width;
        _viewportHeight = height;
        gl.glMatrixMode(GL10.GL_PROJECTION); 
        gl.glViewport(0, 0, (int) _viewportWidth, (int) _viewportHeight);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
    }

我认为这可能与 OpenGL 状态有关,但在我尝试的所有方法中,我还没有找到解决方案。

4

1 回答 1

1

glFrustum()与当前矩阵连接。由于您还没有完成 a glLoadIdentity(),这意味着您将与前一个截锥体相乘。

于 2013-01-21T12:08:45.593 回答