Graphics 在简单体素渲染器中实现环境光遮挡

Graphics 在简单体素渲染器中实现环境光遮挡,graphics,glsl,vulkan,voxel,Graphics,Glsl,Vulkan,Voxel,我目前正在尝试在一个简单的体素渲染器中实现环境光遮挡,每个块都使用24个顶点和12个三角形进行渲染(除非不可见),因此没有任何类型的网格 我遵循了关于minecraft-like worlds的环境光遮挡如何工作的教程,但它没有解释如何在着色器/图形编程中实际实现,所以到目前为止我所做的只是我未受过教育的最佳猜测 基本思想是,为每个顶点生成一个来自周围块的值,该值与环境光遮挡的“暗”程度有关。(别担心我的价值观目前是完全错误的)。这些是从0(无周围环境)到3(顶点完全包围)我链接的教程中的图片

我目前正在尝试在一个简单的体素渲染器中实现环境光遮挡,每个块都使用24个顶点和12个三角形进行渲染(除非不可见),因此没有任何类型的网格

我遵循了关于minecraft-like worlds的环境光遮挡如何工作的教程,但它没有解释如何在着色器/图形编程中实际实现,所以到目前为止我所做的只是我未受过教育的最佳猜测

基本思想是,为每个顶点生成一个来自周围块的值,该值与环境光遮挡的“暗”程度有关。(别担心我的价值观目前是完全错误的)。这些是从0(无周围环境)到3(顶点完全包围)我链接的教程中的图片有助于解释这一点

所以我试过了,但它似乎没有使顶点周围的区域变暗,而是整个三角形,顶点在。。。我怎样才能让它不那样做?我在着色器和图形编程方面完全是初学者,因此非常感谢您的帮助:D

这是我的顶点着色器,输入是

  • 顶点位置
  • 顶点法线
  • 纹理图集中的tex_坐标
  • 平铺uv:块上的位置(左/右底部/顶部为0或1)
  • 环境光遮挡值
#版本450
vec3位置的布局(位置=0);
vec3标准中的布局(位置=1);
vec2 tex_coord中的布局(位置=2);
vec2瓷砖中的布局(位置=3);
uint环境遮挡中的布局(位置=4);
布局(位置=0)输出vec3 v_位置;
布局(位置=1)输出vec3 v_正常;
布局(位置=2)输出向量2 v_tex_坐标;
布局(位置=3)输出vec2 v_tile_uv;
布局(位置=4)输出uint v_环境_遮挡;
布局(集合=0,绑定=0)统一数据{
mat4世界;
mat4视图;
mat4项目;
vec2瓦片尺寸;
}制服;
void main(){
mat4 worldview=uniforms.view*uniforms.world;
v_normal=mat3(转置(逆(制服世界)))*正常;
v_tex_coord=tex_coord;
v_tile_uv=tile_uv;
v_position=vec3(uniforms.world*vec4(position,1.0));
v_环境_遮挡=环境_遮挡;
gl_位置=制服.proj*世界视图*vec4(位置x,位置y,位置z,1.0);
}
这是我的片段着色器:

#版本450
vec3 v_位置的布局(位置=0);
vec3 v_normal中的布局(位置=1);
vec2 v_tex_coord中的布局(位置=2);
vec2 v_tile_uv中的布局(位置=3);
平面uint v_环境_遮挡中的布局(位置=4);
布局(位置=0)输出vec4 f_颜色;
布局(设置=0,绑定=1)均匀采样2D块_纹理;
void main(){
vec3 ao_颜色;
开关(v_环境_遮挡){
案例0:ao_color=vec3(1.0,0.0,0.0);中断;
案例1:ao_color=vec3(0.0,1.0,0.0);中断;
案例2:ao_color=vec3(0.0,0.0,1.0);中断;
案例3:ao_color=vec3(1.0,1.0,1.0);中断;
}
f_颜色=纹理(块纹理,v_纹理坐标);
f_color.rgb=mix(f_color.rgb,vec3(0.05,0.05,0.05),0.3*v_环境光遮挡*距离(v_瓦片紫外,vec2(0.5));
}
此文件的“扁平”部分

layout(location = 4) in flat uint v_ambient_occlusion;
。。。表示对整个三角形使用相同的值(取自激发顶点)。如果要在3个逐顶点值之间进行插值,只需删除
flat
限定符即可

请注意,当前这是一个整型属性值,它必须是平阴影,因此您也需要将输入转换为浮点。

此部分的“平”部分

layout(location = 4) in flat uint v_ambient_occlusion;
。。。表示对整个三角形使用相同的值(取自激发顶点)。如果要在3个逐顶点值之间进行插值,只需删除
flat
限定符即可


请注意,当前这是一个整型属性值,它必须是平阴影,因此您也需要将输入转换为浮点。

Omg。。。我只是盲目地跟踪错误消息,说属性必须是平面的。。这真的很有道理,谢谢你!我一有机会就试试看。。。我只是盲目地跟踪错误消息,说属性必须是平面的。。这真的很有道理,谢谢你!我一有机会就试试看