簡體   English   中英

如何使用具有3D紋理的圖像存儲?

[英]How do I use image store with 3D textures?

我正在嘗試將數據存儲到3D紋理中,但是它似乎不起作用。 我這樣設置紋理:

glGenTextures(1, &voxelTexture);
glBindTexture(GL_TEXTURE_3D, voxelTexture);
unsigned char clearData[VoxelSize* VoxelSize* VoxelSize];
memset(clearData, 5, sizeof(clearData));
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexImage3D(GL_TEXTURE_3D, 0, GL_R8UI, VoxelSize, VoxelSize, VoxelSize, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, clearData);

后來,我寫了紋理:

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, VoxelSize, VoxelSize);
glUseProgram(voxelProg);
glBindTexture(GL_TEXTURE_3D, voxelTexture);
glBindImageTexture(0, voxelTexture, 0, GL_TRUE, 0, GL_WRITE_ONLY, GL_R8UI);
for(const auto & i : models){
    glUniformMatrix4fv(glGetUniformLocation(voxelProg, "M"), 1, GL_FALSE, glm::value_ptr(i->getModelMatrix()));
    glBindVertexArray(i->getMesh()->vao);
    glDrawElements(GL_TRIANGLES, i->getMesh()->nbVertices, GL_UNSIGNED_INT, 0);
}

我知道繪制操作可以正常工作,因為我在程序的另一部分中將它與陰影貼圖一起使用了。

最后,我嘗試從紋理讀取數據:

glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
static char data[VoxelSize * VoxelSize *VoxelSize] = {0};
glGetTexImage(GL_TEXTURE_3D, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data);
for(auto & i : data){
    if(i!=5)
        std::cout << (int)i << " ";
}
endl(std::cout);

如您所見,如果數據被修改,那么它將打印到cout 我將數據設置為5,以便可以看到glGetTexImage實際讀取了紋理數據(因為否則它將全部為零)。

我使用的程序將此作為頂點緩沖區:

#version 430

layout(location = 0) in vec3 position;

uniform mat4 M;

void main(){
    gl_Position = M* vec4(position, 1.0);
}

並將其作為片段緩沖區:

#version 430

layout(binding = 0, r8ui)writeonly restrict uniform uimage3D dataTexture;
void main(){
    imageStore(dataTexture, ivec3(6,6,6), uvec4(30));
}

我使用一個任意位置進行寫入,而不是使用一個受片段本身影響的位置,這樣至少可以確保如果有任何片段通過它會影響紋理。 但是,似乎沒有任何效果。 我嘗試更改imageStore寫入的位置,並嘗試以各種方式縮放頂點緩沖區中的gl_Position 任何幫助,將不勝感激。

編輯:

在遵循將分層設置從false更改為true的可能重復解決方案之后,它仍然不起作用。

glUseProgram(voxelProg)glGetUniformLocation(mainProg, "M")引用不同的着色器程序。 因此,沒有設置矩陣M ,頂點形成了退化的三角形,並且沒有對片段進行柵格化,因此imageStore從未真正被調用。

而且glBindImageTexture 3D紋理處理為“分層的” 2D紋理,因此layered參數必須為GL_TRUE 看到這個

[ 編輯 ]在這種情況下, M也由於其他原因而無法正確投影幾何圖形(請參見注釋)。 若要更改M以使其縮放並將網格轉換為-1到1的立方體以匹配3D圖像,請參見: 如何將網格標准化為-1到1,然后從標准化的網格還原為原始網格?

暫無
暫無

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

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