c++ - 渲染成 3D 纹理

标签 c++ macos opengl 3d glsl

我想将一组点渲染为 3D 纹理。但不知怎的,我没有写进去。使用 glGetTexImage() 我只能为每个条目得到 0 。我将 3D 纹理存储在帧缓冲区中,并使用不同的渲染 channel ,我想从帧缓冲区中存储的 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);

}

在此之前,我尝试使用普通渲染 channel 并将这些点单独存储在 3D 纹理中。这似乎有效。但现在帧缓冲区只写入 0。

最佳答案

您可以使用计算着色器通过一次调用 glDispatchCompute 将所有点写入纹理 3D:

  • 在 SSBO 或 1D 纹理中写入要更新的点的 3D 坐标
  • 绑定(bind)你的SSBO/texture1D和你的texture3D
  • 绑定(bind)您的计算着色器,其应如下所示:
#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);
  • 调用 glMemoryBarrier(),并将参数位字段设置为您打算对 3D 纹理执行的任何操作(当不确定 GL_ALL_BARRIER_BITS 是否是一个好的开始方式时)

关于c++ - 渲染成 3D 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40832277/

相关文章:

c++ - C++ 中的无对象类

c++ - 如何在 OpenGL 中实现绘画(支持图层)?

c++ - CFStringCompareWithOptions 的奇怪行为

c++ - 递归 Lambda 和本地引用

c++ - 为什么 BGL A* 需要隐式图来建模 VertexListGraph?

Mac上编译C程序出现 `Undefined symbols for architecture x86_64`错误

java - 如何在 mac 上从 java 读取和写入原始 ip 数据包?

macos - NSView subview 右键单击无法在 nsimageview 上工作

OpenGL:从 GLSL 中的窗口空间坐标计算眼空间坐标?

c++ - glAccum(模糊效果)适用于一张显卡,但不适用于另一张显卡