mirror of https://github.com/sotrh/learn-wgpu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.1 KiB
Plaintext
45 lines
1.1 KiB
Plaintext
struct Camera {
|
|
view_pos: vec4<f32>,
|
|
view: mat4x4<f32>,
|
|
view_proj: mat4x4<f32>,
|
|
inv_proj: mat4x4<f32>,
|
|
inv_view: mat4x4<f32>,
|
|
}
|
|
@group(0) @binding(0)
|
|
var<uniform> camera: Camera;
|
|
|
|
@group(1)
|
|
@binding(0)
|
|
var env_map: texture_cube<f32>;
|
|
@group(1)
|
|
@binding(1)
|
|
var env_sampler: sampler;
|
|
|
|
struct VertexOutput {
|
|
@builtin(position) frag_position: vec4<f32>,
|
|
@location(0) clip_position: vec4<f32>,
|
|
}
|
|
|
|
@vertex
|
|
fn vs_main(
|
|
@builtin(vertex_index) id: u32,
|
|
) -> VertexOutput {
|
|
let uv = vec2<f32>(vec2<u32>(
|
|
id & 1u,
|
|
(id >> 1u) & 1u,
|
|
));
|
|
var out: VertexOutput;
|
|
out.clip_position = vec4(uv * 4.0 - 1.0, 1.0, 1.0);
|
|
out.frag_position = out.clip_position;
|
|
return out;
|
|
}
|
|
|
|
@fragment
|
|
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
|
|
let view_pos_homogeneous = camera.inv_proj * in.clip_position;
|
|
let view_ray_direction = view_pos_homogeneous.xyz / view_pos_homogeneous.w;
|
|
var ray_direction = normalize((camera.inv_view * vec4(view_ray_direction, 0.0)).xyz);
|
|
|
|
let sample = textureSample(env_map, env_sampler, ray_direction);
|
|
return sample;
|
|
} |