簡體   English   中英

OpenGL ES 2.0和動態VBO

[英]OpenGL ES 2.0 and Dynamic VBO's

我已經解決了現有主題並對其進行了一些自我測試,但是我不確定自己是否以正確的方式進行操作,因此我寧願問一個問題,也不要花很多時間來弄清楚自己的意思。誤解了多個OpenGL ES 2.0教程。

我已經實現了VBO,正如在“ OpenGL ES 2 for Android-快速入門指南”中介紹的那樣,現在我需要一個動態VBO,該VBO會通過一些矩陣計算在每一幀進行更新(這可能是在模型頂點上的錯誤)。 經過這些計算之后,我想使用這段Android / Java代碼將其傳輸(更新)到已經分配的VBO(帶有glBufferData):

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.id);

    //GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.getLength() * Utils.BYTES_PER_FLOAT, null, GLES20.GL_DYNAMIC_DRAW);

    /* CREATE BUFFER AND SET POSITION */
    FloatBuffer fBuffer = ByteBuffer.allocateDirect((this.length = vertices.length) * Utils.BYTES_PER_FLOAT)
            .order(ByteOrder.nativeOrder()).asFloatBuffer().put(vertices);
    fBuffer.position(0);

    GLES20.glBufferSubData(GLES20.GL_ARRAY_BUFFER, 0, fBuffer.capacity(), fBuffer);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
  • this.id-先前生成的緩沖區的ID
  • this.getLength-最初分配的FloatBuffer的長度

如您所見,我已經注釋掉了其他問題中提到的這一行,這僅僅是因為將其保持在屏幕上閃爍的對象是我無法正確理解的結尾。 通過這種方式,一切都可以正常運行,但在應用程序運行期間我注意到了一些GC_FOR_ALLOC,這確保了我可能不是有效的代碼。

問題(或多或少)是:

  • 這是更新此類緩沖區的有效方法,還是我可以在我提供的環境下(OpenGL ES 2.0,Android 4+)獲得如何正確執行操作的建議?

一個子問題是:

  • 在這種情況下,將VBO用於動態模型的方法是否比使用VAO更好?或者我應該為靜態模型實現VBO方法,還是為動力學實現VAO?
  • 我什么時候應該開始只考慮GC_FOR_ALLOC調試信息而擔心內存問題?
  • (僅在主題子問題之外)使用正交等距視圖矩陣(正交+ 2x旋轉+ Z平移)為應用程序創建GUI的合適方法是什么?

編輯(27.12):

要獲得等軸測投影矩陣,我只需使用以下幾行:

    Matrix.orthoM(this.orthoProjectionMatrix, 0, -screenAspect, screenAspect, -1.0f, 1.0f, -1.0f, 10.0f);
    Matrix.translateM(this.viewProjectionMatrix, 0, this.orthoProjectionMatrix, 0, 0.0f, 0.0f, -5.0f);
    Matrix.rotateM(this.viewProjectionMatrix, 0, 45, 1.0f, 0.0f, 0.0f);
    Matrix.rotateM(this.viewProjectionMatrix, 0, 45, 0.0f, 1.0f, 0.0f);

這很簡單:

  • 根據屏幕的外觀創建正交的縱向投影
  • 平移僅在Z軸上移動(因此可以從遠處看到場景)
  • 將X軸旋轉45度
  • 將Y軸旋轉45度

有些元素放在一起,所以請不要考慮以下事實:有些翻譯就位,有些翻譯到另一個矩陣。

(前言:我不熟悉OpenGL ES,只是不熟悉常規OpenGL。但是,我無法想象API的差異太大)

這是更新此類緩沖區的有效方法

除非fBuffer始終小於或等於OpenGL緩沖區的大小,否則fBuffer glBufferSubData不會調整緩沖區的大小,並且不允許寫入分配的范圍之外。 您可以使用glBufferData將緩沖區重新分配為新的大小。 還檢查緩沖區對象流

在這種情況下,將VBO用於動態模型的方法是否比使用VAO更好?或者我應該為靜態模型實現VBO方法,還是為動力學實現VAO?

VBO和VAO是正交的概念。 VBO存儲頂點數據; VAO僅指定在何處以及如何獲取頂點進行渲染。

使用正交等軸測視圖矩陣(正交+ 2x旋轉+ Z平移)為應用程序創建GUI的合適方法是什么?

刪除Z平移,然后在禁用深度緩沖區的情況下最后呈現GUI。 另外,輪換是為了什么?

暫無
暫無

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

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