簡體   English   中英

在片段着色器OpenGL中寫入多個3Dtextures

[英]Write to mutiple 3Dtextures in fragment shader OpenGL

我有一個3D紋理,我在這里編寫數據,並以這種方式在片段着色器中將其用作體素:

#extension GL_ARB_shader_image_size : enable
...
layout (binding = 0, rgba8) coherent uniform image3D volumeTexture;
...
void main(){
vec4 fragmentColor = ...
vec3 coords = ...
imageStore(volumeTexture, ivec3(coords), fragmentColor);
}

並以這種方式定義紋理

glGenTextures(1, &volumeTexture);
glBindTexture(GL_TEXTURE_3D, volumeTexture);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, volumeDimensions, volumeDimensions, volumeDimensions, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

然后我必須使用它

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, volumeTexture);

現在我的問題是我希望有一個mipmap版本的這個並且不使用opengl函數因為我注意到它非常慢。 所以我想在同一時間在所有級別的3D紋理中進行編寫,例如,最大分辨率為512 ^ 3,當我在3dtex中寫入1個體素值時,我也為256 ^ 3寫入0.125 * VALUE體素和0.015625 *值為126 ^ 3等。由於我使用的是使用原子性的imageStore,所有的值都將被寫入並使用這些權重我會自動得到平均值(不完全像插值但我可能得到一個令人滿意的結果無論如何)。 所以我的問題是,有多個3dtextures並同時寫入所有這些文本的最佳方法是什么?

我相信硬件mipmapping的速度和你一樣快。 我總是假設嘗試自定義mipmapping會變慢,因為你必須依次手動綁定和柵格化每個圖層。 原子論會給出巨大的爭論,而且速度會非常慢。 即使沒有原子,你也會否定mipmap的漂亮O(log n)結構。

在訪問順序和緩存方面,您必須非常小心imageStore 我從這里開始嘗試一些不同的索引(例如行/列與列/行)。

您可以嘗試通過將其綁定到FBO並使用glDrawElementsInstanced繪制全屏三角形(覆蓋視口的大三角形)來繪制舊方式的紋理。 在幾何着色器中,將gl_Layer設置為實例ID。 光柵化器為x / y創建片段,圖層給出z。

最后,即使按今天的標准,512 ^ 3也只是一個巨大的質感。 也許找出你的理論最大gpu帶寬,以了解你有多遠。 EG可以說你的GPU可以達到200GB / s。 無論如何,你可能只會獲得100分。 你的512 ^ 3紋理是512MB所以你可以在~5ms內寫入它(imo這看起來非常快,也許我犯了一個錯誤)。 期望從管道的其余部分,產生和執行線程等一些開銷和延遲。如果你正在編寫復雜的東西,那么內存帶寬不是瓶頸,我的估計就會消失。 所以試着先寫零。 然后嘗試更改coords xyz順序。


更新:不是使用片段着色器來創建線程,而是可以使用頂點着色器,理論上可以避免光柵化器開銷,盡管我已經看到它不能執行的情況。 glEnable(GL_RASTERIZER_DISCARD) glDrawArrays(GL_POINTS, 0, numThreads)並使用gl_VertexID為您的線程索引。

暫無
暫無

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

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