呈现为3D纹理

Render into a 3D Texture

本文关键字:纹理 3D      更新时间:2023-10-16

我想将一组点渲染为3D纹理。但是某种程度上我不写它。使用GLGETTEXIMAGE(),每个条目只能获得0。我将3D纹理存储在框架缓冲器中,并且使用不同的渲染通道,我想从框架缓冲区中存储的3DTextul中读取信息。

Initialization of the FrameBuffer.
glGenFramebuffers(1, &_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_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_RGBA, GRID_SIZE, GRID_SIZE, GRID_SIZE, 0, GL_RGBA, GL_FLOAT, NULL);
glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D, texture, 0, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {
    std::cout << "FBO successfully loadet" << std::endl;
}else{
    std::cout << "FBO had en ERROR" << std::endl;
}

顶点着色器:

#version 330 core
layout (location = 0) in vec3 position;
void main(){
    gl_PointSize = 1.0;
    gl_Position = vec4(position,1.0);
}

片段着色器:

#version 330 core
out vec4 fragColor;
void main(){
    fragColor = vec4(1.0,1.0,1.0, 1.0);
}

在此之前,我尝试了正常的渲染通行证,并将这些点分别存储在3D纹理中。这似乎有效。但是现在使用帧缓冲区,它仅写入0。

您可以使用Compute着色器将所有点写入纹理3D,并单个调用gldisPatchCompute:

  • 编写要在SSBO或Texture1d
  • 的要点的要点的3D坐标
  • 绑定您的SSBO/TEXTURE1D和纹理3D
  • 绑定您的计算着色器,它应该像这样:
#version 430
layout (binding=0, rgba16i) readonly uniform image1D points
layout (binding=1, rgba16f) writeonly uniform image3D tex3D
void main()
{
    ivec3 point_coords = imageLoad(points, gl_GlobalInvocationID.x).xyz;
    imageStore(tex3D, point_coords, vec4(1.0,1.0,1.0, 1.0));
}
  • 致电gldispatchcompute(pointCount,0,0);
  • call glmemorybarrier()将param Bitfield设置为您打算使用Texture3D进行的任何操作(当UNSUNES GL_ALL_ALL_BARRIER_BITS是启动的好方法时)