可视化用行军立方体生成的等值面

我目前使用OpenGL(更具体地说是通过VisPy绑定)来做一些科学数据可视化。 我有一个体积数据集,我想要可视化其中的一些等值面。 我使用Python的skimage.measure库中的skimage.measure立方体算法生成等值面。

所以,我有一组顶点,并且我有一组索引,它们定义了由skimage.measure.marching_cubes输出的网格的三角skimage.measure.marching_cubes 。 这些可以直接转换为VertexBufferIndexBuffer对象进行渲染。 但是将纹理应用到等值面的正确方法是什么? 我不需要做任何幻想,基本上只是一些颜色,所以它可以更清晰地形象化。

基本上,这是我的困惑。 顶点坐标在框[0,2] x [0,2] x [0, 1] ,因为我的体积在xy中的长度是z两倍。 如果我的理解正确[0,1] x [0,1] x [0, 1]纹理坐标总是在[0,1] x [0,1] x [0, 1]立方体上定义。 我一直试图生成一个简单的体积纹理,将顶点坐标转换为纹理坐标,方法是将xy分量除以2,然后在体积纹理中使用这些坐标作为texcoord 。 但这不起作用(请参阅附图)。 以下是一些代码:

顶点着色器:

uniform mat4 u_model;
uniform mat4 u_view;
uniform mat4 u_projection;
attribute vec3 a_position;
attribute vec3 a_texcoord;
varying vec3 v_texcoord;
void main() {
    gl_Position = u_projection * u_view * u_model * vec4(a_position, 1.0);
    v_texcoord  = a_texcoord;
}

片段着色器:

uniform sampler3D u_texture;
varying vec3 v_texcoord;
void main() {
    float r = texture3D(u_texture, v_texcoord).r;
    float g = texture3D(u_texture, v_texcoord).g;
    float b = texture3D(u_texture, v_texcoord).b;
    gl_FragColor = vec4(r, g, b, 1);
}

3D纹理当前设置如下。 请注意,这个纹理不应该意味着那么多; 我只是试图在各个方向上放一个渐变,并使用这些设置,以便我可以看到输出的差异。 改变这个纹理对我所看到的没有影响。

D, H, W = 64, 128, 128
texture_arr = np.ones((W, H, D, 4)).astype(np.float32)
texture_arr[...] *= np.linspace(0, 1, W)[:, np.newaxis, np.newaxis, np.newaxis]
texture_arr[...] *= np.linspace(0, 1, H)[np.newaxis, :, np.newaxis, np.newaxis]
texture_arr[...] *= np.linspace(0, 1, D)[np.newaxis, np.newaxis, :, np.newaxis]

VertexBufferIndexBuffer与行进立方体算法的输出完全相同。 如上所述, texcoord只是xy坐标除以2的顶点坐标。

下面是我所看到的截图,它具有正确的等值面形状,但是质地可怕是错误的。


自OpenGL 3.0以来,gl_FragColor已被弃用,您是否使用旧版本或更新版本的OpenGL? 也许你可以试试这个片段着色器。

uniform sampler3D u_texture;
varying vec3 v_texcoord;
out vec4 FragColor;    
void main() 
{
    FragColor = vec4(texture(u_texture, v_texcoord), 1);
}
链接地址: http://www.djcxy.com/p/37249.html

上一篇: Visualizing an isosurface generated with marching cubes

下一篇: marching cubes, very small triangles