簡體   English   中英

OpenGL ES:渲染時使用glFrustrum

[英]OpenGL ES: glFrustrum at rendering time

我正在使用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();
    }

但是現在,我想在render方法中更新視錐,以執行縮放和/或圖像失真。 但是,這似乎是平截頭體更新

這是呈現代碼(除了一些普通的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狀態有關,但在我嘗試過的所有方法中,我還沒有找到解決方案。

glFrustum()與當前矩陣連接。 由於您還沒有完成glLoadIdentity() ,這意味着您將要與以前的平截頭體相乘。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM