簡體   English   中英

有沒有更快的方法在 OpenGL 中指定立方體貼圖紋理?

[英]Is there a quicker way to specify cubemap texture in OpenGL?

我通過以下方式為我的天空盒指定立方體貼圖紋理:

 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(0));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 1, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(1));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(2));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 3, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(3));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 4, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(4));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 5, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(5));

texData是一個unsigned char* vector

使用 Visual Studio Debugger 我發現每行大約需要 4 毫秒來運行,所以使用 6 行來指定立方體貼圖紋理總共需要大約 20-25 毫秒。 我在主循環的每次迭代中更新這個立方體貼圖紋理,它大大減慢了我的主循環。 我知道天空盒傳統上是靜態的,但我的應用程序需要更新天空盒,因為我正在創建 360 度視頻查看器。

有沒有另一種方法可以更快地指定立方體貼圖紋理? 我已經檢查了 OpenGL 的文檔,但我沒有看到更快的方法。

更新:除了第0th次迭代之外,我用glTexSubImage2D替換了所有迭代的glTexImage2D ,現在 6 glTexSubImage2D行所花費的總時間低於 5ms。 這對我來說是令人滿意的,但我想我會留下這個問題,因為從技術上講還沒有答案。

glTexImage速度較慢,因為每次調用它時,它都會在驅動程序端分配內存,並將圖像中的像素數據從 CPU 復制到 GPU,這發生在總線上。

另一方面, glTexSubImage不是每次都分配內存。 第一次調用時,它分配內存並保存指向它的指針。 稍后它只是通過該指針直接復制到內存中。

我認為根據您提到的過濾標志,OpenGL 可能會創建不同的紋理級別。

嘗試使用級別為1 glTexStorage2D

此外,嘗試使用 SOIL 庫 - 它具有一個帶有簡單 API 的函數來加載立方體貼圖。

您可以嘗試的另一件事是壓縮紋理,然后分析您的程序 - 我相信這個選項應該會給您最好的性能。

glTexImage2D 很慢,因為它將大量 dqta 從 CPU 內存復制到 GPU 內存。 如果圖像來自視頻解碼器,它們可能已經在 GPU 內存中。 在這種情況下,您可以使用 OpenGL 擴展進行紋理化。

不過,這些往往是特定於平台的。

暫無
暫無

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

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