2

我正在尝试写入和读取 3D 纹理,但我的映射似乎是错误的。我已经使用 Render doc 来检查纹理,它们看起来还不错。

这种体积纹理的随机层如下所示:

在此处输入图像描述

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

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

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 坐标可能完全错误(我不确定我是否应该对深度分量进行归一化),但这不是唯一的问题。如果您查看最终结果:

在此处输入图像描述

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

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

4

0 回答 0