2016-07-04 45 views
0

我很難更改我的GLSurfaceView渲染網格,更確切地說是渲染器中,我想有一些我在工作流程中沒有理解的東西渲染器類。如何更改GLSurfaceView.Renderer中的渲染對象

所以,讓我們考慮,我們有這樣的:

public class MyRenderer extends GLSurfaceView.Renderer{ 
    private Mesh aMesh; 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config){ 
     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     aMesh = new Mesh("TestMesh1"); 
    } 
    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     ...Creating viewport... 
    } 
    @Override 
    public void onDrawFrame(GL10 gl) { 
     GLES20.glClear(gl.GL_COLOR_BUFFER_BIT); 
     ...all Maths to create mvpMatrix... 
     aMesh.draw(mvpMatrix); 
    } 
} 

因此,這是完美的工作,AMESH是所有好設置在屏幕上顯示。現在,我想改變,當用戶按下一個按鈕,這個網格,並刷新我的渲染我創建的渲染器的具體方法,如下:

public class MyRenderer extends GLSurfaceView.Renderer{ 
    private Mesh aMesh; 

    public void changeMesh(String newMeshName){ 
     GLES20.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT); 
     .... 
     aMesh=new Mesh(newMeshName); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config){ 
     .... 
    } 
    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     ... 
    } 
    @Override 
    public void onDrawFrame(GL10 gl) { 
     aMesh.draw(mvpMatrix); 
    } 
} 

所以在我的腦海裏,叫changeMes​​h將使onDrawFrame方法來重新繪製一個新的模型,對吧? 我的問題是,結果是一個空的渲染器。它甚至沒有崩潰或如此。當我打電話給changeMes​​h()時,先前顯示的網格消失(如預期的那樣),但是新的不是繪製。

所以我想知道,是否需要創建一個新的渲染器(這似乎有點沉重)?有沒有辦法在OnSurfaceCreated中手動請求傳遞?我對這個bug有點遺憾,因爲它有點意外。

+0

你所描述的代碼應該可以工作。在您更改網格並檢查繪製內容後,我將在調試器中逐步完成繪圖調用。 –

回答

1

問題的一部分是電話新的,我無法解釋究竟是什麼原因,但它似乎在某種程度上打破了OpenGL對象和我的緩衝區之間的聯繫。我用一種「setter」解決了這個問題,它只是改變Mesh實例中的所有數據以適應其他Mesh的數據,這樣我就可以保存第一個實例的內存地址。

這有點奇怪,但這解決了我的問題,也許它可以幫助別人。