[英]Render into a 3D Texture
我想将一组点渲染成 3D 纹理。 但不知何故,我没有写进去。 使用 glGetTexImage() 我只为每个条目得到 0。 我将 3D 纹理存储在帧缓冲区中,并使用不同的渲染通道从存储在帧缓冲区中的 3D 纹理中读出信息。
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。
您可以使用计算着色器通过一次调用 glDispatchCompute 将所有点写入纹理 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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.