我试图从3D纹理中写入和读取,但似乎我的映射是错误的。我使用Render doc检查纹理,看起来没问题。
这个voluemtric纹理的随机层看起来像:
所以只有一些蓝色表示缺席,一些绿色值表示存在。
我写入每个图层时计算的坐标在顶点着色器中计算为:
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坐标可能完全错误(我不确定我是否应该对深度组件进行标准化)但这不是唯一的问题。如果你看看最终结果:
存在水平sclae组件问题。由于每个纹素代表一个体素,因此立方体的颜色应始终为固定颜色。但正如你所看到的,我在顶面上为一个立方体获得了多种颜色。所以我的横向尺度是错误的。
从纹理中提取纹素时我做错了什么?