gpt4 book ai didi

opengl - 阴影贴图着色器

转载 作者:行者123 更新时间:2023-12-04 19:07:12 24 4
gpt4 key购买 nike

我有一个实现阴影映射的着色器,如下所示:

#version 430 core

out vec4 color;

in VS_OUT {
vec3 N;
vec3 L;
vec3 V;
vec4 shadow_coord;
} fs_in;

layout(binding = 0) uniform sampler2DShadow shadow_tex;

uniform vec3 light_ambient_albedo = vec3(1.0);
uniform vec3 light_diffuse_albedo = vec3(1.0);
uniform vec3 light_specular_albedo = vec3(1.0);

uniform vec3 ambient_albedo = vec3(0.1, 0.1, 0.2);
uniform vec3 diffuse_albedo = vec3(0.4, 0.4, 0.8);
uniform vec3 specular_albedo = vec3(0.0, 0.0, 0.0);
uniform float specular_power = 128.0;

void main(void) {
//color = vec4(0.4, 0.4, 0.8, 1.0);

//normalize
vec3 N = normalize(fs_in.N);
vec3 L = normalize(fs_in.L);
vec3 V = normalize(fs_in.V);

//calculate R
vec3 R = reflect(-L, N);

//calcualte ambient
vec3 ambient = ambient_albedo * light_ambient_albedo;

//calculate diffuse
vec3 diffuse = max(dot(N, L), 0.0) * diffuse_albedo * light_diffuse_albedo;

//calcualte spcular
vec3 specular = pow(max(dot(R, V), 0.0), specular_power) * specular_albedo * light_specular_albedo;

//write color
color = textureProj(shadow_tex, fs_in.shadow_coord) * vec4(ambient + diffuse + specular, 0.5);
//if in shadow, then multiply color by 0.5 ^^, except alpha
}

我想要做的是首先检查片段是否确实在阴影中,并且只有 然后 更改颜色(将其减半,使其成为全黑和原始颜色之间的一半)。

但是如何检查 textureProj(...)结果确实在阴影中,据我所知它返回一个规范化的 float值(value)。

会像 textureProj(...) > 0.9999已经够了吗?我知道如果您使用多重采样,它可以返回零或一以外的值,并且我希望行为不会在某一点中断。

输出顶点着色器:
#version 430 core

layout(location = 0) in vec4 position;

layout(location = 0) uniform mat4 model_matrix;
layout(location = 1) uniform mat4 view_matrix;
layout(location = 2) uniform mat4 proj_matrix;
layout(location = 3) uniform mat4 shadow_matrix;

out VS_OUT {
vec3 N;
vec3 L;
vec3 V;
vec4 shadow_coord;
} vs_out;

uniform vec4 light_pos = vec4(-20.0, 7.5, -20.0, 1.0);

void main(void) {
vec4 local_light_pos = view_matrix * light_pos;
vec4 p = view_matrix * model_matrix * position;

//normal
vs_out.N = vec3(0.0, 1.0, 0.0);

//light vector
vs_out.L = local_light_pos.xyz - p.xyz;

//view vector
vs_out.V = -p.xyz;

//light space coordinates
vs_out.shadow_coord = shadow_matrix * position;

gl_Position = proj_matrix * p;
}

请注意,片段着色器用于地形,顶点着色器用于地板,因此两者之间可能存在轻微的不一致,但它们应该是不相关的。
shadow_matrix是作为 bias_matrix * light_projection_matrix * light_view_matrix * light_model_matrix 传入的制服.

最佳答案

textureProj (...)不返回规范化的浮点值。它确实返回一个 float如果你在 sampler<1D|2D|2DRect>Shadow 上使用它,但该值代表深度测试的结果。 1.0 = 通过, 0.0 =失败。

现在,这里要注意有趣的事情,以及返回 float 的原因。因为阴影采样器的意义在于过滤阴影贴图。如果您使用 GL_LINEAR阴影贴图上的过滤模式与阴影采样器一起使用,GL 将实际选择阴影贴图中最接近的 4 个纹素并执行 4 次独立的深度测试。

每次深度测试仍然有一个二进制结果,但 GL 将返回所有 4 个测试结果的加权平均值(基于与理想样本位置的距离)。所以如果你使用 GL_LINEAR结合阴影采样器,您将获得一个介于 之间的值。 0.0 1.0 表示 4 个最近深度样本的平均遮挡。

我应该指出你对 textureProj (...) 的使用对我来说看起来可能是错误的。它使用的坐标是一个 4D 向量,由 ( s , t , r ) [投影坐标] 和 ( q ) [要测试的深度值] 组成。我在您的代码中没有看到您正在分配的任何地方 q一个深度值。如果您可以编辑您的问题以包含输出 shadow_coord 的顶点/几何着色器,那会有所帮助。

关于opengl - 阴影贴图着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21605146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com