繁体   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