首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简易Voxel渲染器实现环境遮挡

简易Voxel渲染器实现环境遮挡
EN

Stack Overflow用户
提问于 2020-02-08 10:51:26
回答 1查看 599关注 0票数 0

我目前正在尝试在一个简单的Voxel渲染器中实现环境遮挡,每个块被渲染(除非不可见)有24个顶点和12个三角形,所以没有任何类型的网格。

我学习了教程中关于类似于我的世界的环境遮挡是如何工作的,但它并没有解释如何在着色器/图形编程中真正实现这一点,所以到目前为止,我所做的只是我未受过教育的最佳猜测。

基本思想是,每个顶点从周围的块中生成一个关于环境遮挡应该有多“暗”的值。(现在我的价值观完全错了)。这些是从0(无周围环境)到3(顶点完全被包围),我所链接的教程中的图片帮助解释了这一点。

所以我试过了,但是它似乎没有使顶点周围的区域变暗,而是整个三角形,顶点在.我怎么能让它不那么做呢?我是一个完全初学者的着色器和图形编程,所以任何帮助都是感激的:D

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

  • 顶点位置
  • 顶点法
  • 纹理地图集中的tex_coord
  • tile_uv:在块上的位置(左/右底部/顶部为0或1)
  • ambient_occlusion值
代码语言:javascript
复制
#version 450

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 tex_coord;
layout(location = 3) in vec2 tile_uv;
layout(location = 4) in uint ambient_occlusion;

layout(location = 0) out vec3 v_position;
layout(location = 1) out vec3 v_normal;
layout(location = 2) out vec2 v_tex_coord;
layout(location = 3) out vec2 v_tile_uv;
layout(location = 4) out uint v_ambient_occlusion;

layout(set = 0, binding = 0) uniform Data {
    mat4 world;
    mat4 view;
    mat4 proj;
    vec2 tile_size;
} uniforms;

void main() {
    mat4 worldview = uniforms.view * uniforms.world;
    v_normal = mat3(transpose(inverse(uniforms.world))) * normal;
    v_tex_coord = tex_coord;
    v_tile_uv = tile_uv;
    v_position = vec3(uniforms.world * vec4(position, 1.0));
    v_ambient_occlusion = ambient_occlusion;
    gl_Position = uniforms.proj * worldview * vec4(position.x, position.y, position.z, 1.0);
}

这是我的碎片着色器:

代码语言:javascript
复制
#version 450

layout(location = 0) in vec3 v_position;
layout(location = 1) in vec3 v_normal;
layout(location = 2) in vec2 v_tex_coord;
layout(location = 3) in vec2 v_tile_uv;
layout(location = 4) in flat uint v_ambient_occlusion;

layout(location = 0) out vec4 f_color;

layout(set = 0, binding = 1) uniform sampler2D block_texture;

void main() {
    vec3 ao_color;
    switch (v_ambient_occlusion) {
        case 0: ao_color = vec3(1.0, 0.0, 0.0); break;
        case 1: ao_color = vec3(0.0, 1.0, 0.0); break;
        case 2: ao_color = vec3(0.0, 0.0, 1.0); break;
        case 3: ao_color = vec3(1.0, 1.0, 1.0); break;
    }

    f_color = texture(block_texture, v_tex_coord);
    f_color.rgb = mix(f_color.rgb, vec3(0.05, 0.05, 0.05), 0.3 * v_ambient_occlusion * distance(v_tile_uv, vec2(0.5)));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-09 21:08:42

“平”部分..。

代码语言:javascript
复制
layout(location = 4) in flat uint v_ambient_occlusion;

..。意味着对整个三角形使用相同的值(取自发人深省的顶点)。如果您希望在3个每个顶点值之间进行插值,那么只需删除flat限定符即可。

注意,目前这是一个整数属性值,必须是平面阴影,所以您也需要将输入转换为浮点数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60126060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档