Added skybox to renderer and reflections to shader. Builds and runs. Flickering with many objects in scene, assuming swap chain issue.
This commit is contained in:
parent
efe98454d9
commit
3231ed9190
10 changed files with 1829 additions and 1449 deletions
|
|
@ -4,16 +4,26 @@ struct Environment {
|
|||
dir: vec4<f32>,
|
||||
}
|
||||
|
||||
struct View {
|
||||
struct Eye {
|
||||
// from camera to screen
|
||||
proj: mat4x4<f32>,
|
||||
// from screen to camera
|
||||
inv: mat4x4<f32>,
|
||||
// world to camera
|
||||
view: mat4x4<f32>,
|
||||
// camera transform
|
||||
frame: mat4x4<f32>,
|
||||
}
|
||||
|
||||
// Vertex shader
|
||||
@group(0) @binding(0)
|
||||
var<uniform> view: View;
|
||||
var<uniform> eye: Eye;
|
||||
@group(0) @binding(1)
|
||||
var<uniform> environment: Environment;
|
||||
@group(0) @binding(2)
|
||||
var sky_sampler: sampler;
|
||||
@group(0) @binding(3)
|
||||
var sky_texture: texture_2d<f32>;
|
||||
|
||||
struct VertexInput {
|
||||
@location(0) position: vec3<f32>,
|
||||
|
|
@ -60,7 +70,7 @@ fn vs_main(
|
|||
out.world_normal = model_rot_matrix * model.normal;
|
||||
var world_position: vec4<f32> = model_matrix * vec4<f32>(model.position, 1.0);
|
||||
out.world_position = world_position.xyz;
|
||||
out.clip_position = view.view * world_position;
|
||||
out.clip_position = eye.proj * eye.view * world_position;
|
||||
return out;
|
||||
}
|
||||
|
||||
|
|
@ -75,23 +85,79 @@ var t_normal: texture_2d<f32>;
|
|||
@group(1) @binding(3)
|
||||
var t_rough: texture_2d<f32>;
|
||||
|
||||
fn sky_aspect(look: vec3<f32>) -> vec4<f32> {
|
||||
var pi = 3.14159;
|
||||
let u_angle = atan2(look.x,look.z);
|
||||
let u = (u_angle/pi) + 0.5; // from -pi/2 -> pi/2 into 0 -> 1
|
||||
let v_angle = atan2(-look.y,sqrt(look.x * look.x + look.z * look.z));
|
||||
let v = (v_angle/pi) + 0.5;//(v_angle/pi) + 0.5; // from -pi/2 -> pi/2 into 0 -> 1
|
||||
let uv = vec2<f32>(u,v); // Get UV on skybox
|
||||
return textureSample(sky_texture, sky_sampler, uv);
|
||||
}
|
||||
|
||||
fn rotation(mat: mat4x4<f32>) -> mat3x3<f32> {
|
||||
return mat3x3<f32>(
|
||||
mat[0].xyz,
|
||||
mat[1].xyz,
|
||||
mat[2].xyz,
|
||||
);
|
||||
}
|
||||
|
||||
fn translation(mat: mat4x4<f32>) -> vec4<f32> {
|
||||
//return vec4<f32>(mat[0][3],mat[1][3],mat[2][3],mat[3][3]);
|
||||
return mat[3];
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
|
||||
let object_color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords);
|
||||
let object_normal: vec4<f32> = textureSample(t_normal, s_diffuse, in.tex_coords);
|
||||
|
||||
let tangent_normal = object_normal.xyz * 2.0 - 1.0;
|
||||
let light_dir = normalize(environment.dir.xyz);
|
||||
let view_dir = normalize(view.frame[3].xyz - in.world_position);
|
||||
let half_dir = normalize(view_dir + light_dir);
|
||||
let diffuse_color = object_color.xyz;
|
||||
let specular_color = vec3<f32>(0.0,0.0,0.0);
|
||||
let reflection = sky_aspect(reflect(normalize(in.world_position-translation(eye.frame).xyz),normalize(in.world_normal)));
|
||||
|
||||
let diffuse_strength = max(dot(tangent_normal, light_dir), 0.0);
|
||||
let diffuse_color = environment.light.xyz * diffuse_strength;
|
||||
//let result = (environment.ambient.xyz + diffuse_color + specular_color) * object_color.xyz;
|
||||
|
||||
let specular_strength = pow(max(dot(tangent_normal, half_dir), 0.0), 32.0);
|
||||
let specular_color = specular_strength * environment.light.xyz;
|
||||
//let light_dir = normalize(environment.dir.xyz);
|
||||
//let view_dir = normalize(eye.frame[3].xyz - in.world_position);
|
||||
//let half_dir = normalize(view_dir + light_dir);
|
||||
|
||||
//let diffuse_strength = max(dot(tangent_normal, light_dir), 0.0);
|
||||
//let diffuse_color = environment.light.xyz * diffuse_strength;
|
||||
|
||||
//let specular_strength = pow(max(dot(tangent_normal, half_dir), 0.0), 32.0);
|
||||
//let specular_color = specular_strength * environment.light.xyz;
|
||||
|
||||
let result = (environment.ambient.xyz + diffuse_color.xyz + specular_color.xyz) * object_color.xyz;
|
||||
|
||||
return vec4<f32>(result.xyz,object_color.a);
|
||||
}
|
||||
return vec4<f32>(reflection.xyz,object_color.a);
|
||||
}
|
||||
|
||||
struct SkyOutput {
|
||||
@builtin(position) position: vec4<f32>,
|
||||
@location(0) pos: vec4<f32> // unadulterated by WGSL
|
||||
}
|
||||
|
||||
const TRI_VERTICES = array(
|
||||
vec4(-1.0, -1.0, 1.0, 1.0),
|
||||
vec4(-1.0, 1.0, 1.0, 1.0),
|
||||
vec4( 1.0, -1.0, 1.0, 1.0),
|
||||
vec4( 1.0, 1.0, 1.0, 1.0),
|
||||
vec4(-1.0, 1.0, 1.0, 1.0),
|
||||
vec4( 1.0, -1.0, 1.0, 1.0),
|
||||
);
|
||||
|
||||
@vertex
|
||||
fn vs_sky(@builtin(vertex_index) index: u32) -> SkyOutput {
|
||||
var out: SkyOutput;
|
||||
out.position = TRI_VERTICES[index];
|
||||
out.pos = out.position;
|
||||
return out;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_sky(in: SkyOutput) -> @location(0) vec4<f32> {
|
||||
let look = rotation(eye.frame) * in.pos.xyz;
|
||||
return sky_aspect(look);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue