坐标系如何在OpenGL中处理3D纹理?

时间:2018-03-04 21:45:30

标签: opengl textures rendering 3d-texture

我试图从3D纹理中写入和读取,但似乎我的映射是错误的。我使用Render doc检查纹理,看起来没问题。

这个voluemtric纹理的随机层看起来像:

enter image description here

所以只有一些蓝色表示缺席,一些绿色值表示存在。

我写入每个图层时计算的坐标在顶点着色器中计算为:

pos.x = (2.f*pos.x-width+2)/(width-2);
pos.y = (2.f*pos.y-depth+2)/(depth-2);

pos.z -= level;
pos.z *= 1.f/voxel_size;

gl_Position = pos;

由于纹理本身看起来不错,看起来这些坐标很适合我的目标。

重要的是要注意,现在voxel_size是1,纹理的比例应该是场景尺寸的1比1。实质上,纹理中的每个像素代表场景中的1x1x1体素。

接下来,我尝试按如下方式获取纹理值:

vec3 pos = vertexPos;
pos.x = (2.f*pos.x-width+2)/(width-2);
pos.y = (2.f*pos.y-depth+2)/(depth-2);

pos.z *= 1.f/(4*16);

outColor = texture(voxel_map, pos);

其中vertexPos是场景中的全局顶点位置。然而,z坐标可能完全错误(我不确定我是否应该对深度组件进行标准化)但这不是唯一的问题。如果你看看最终结果:

enter image description here

存在水平sclae组件问题。由于每个纹素代表一个体素,因此立方体的颜色应始终为固定颜色。但正如你所看到的,我在顶面上为一个立方体获得了多种颜色。所以我的横向尺度是错误的。

从纹理中提取纹素时我做错了什么?

0 个答案:

没有答案