texture coordinates + fake fresnel using dot

This commit is contained in:
Quaternions 2023-09-06 14:11:56 -07:00
parent 5fb9f8b1bc
commit 8aad878d49
2 changed files with 13 additions and 5 deletions

View File

@ -8,6 +8,7 @@ const IMAGE_SIZE: u32 = 128;
#[repr(C)] #[repr(C)]
struct Vertex { struct Vertex {
pos: [f32; 3], pos: [f32; 3],
texture: [f32; 2],
normal: [f32; 3], normal: [f32; 3],
} }
@ -182,6 +183,7 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec<ModelData>,source:&[u8]){
let i=vertices.len() as u16; let i=vertices.len() as u16;
vertices.push(Vertex { vertices.push(Vertex {
pos: data.position[vert.0], pos: data.position[vert.0],
texture: data.texture[vert.1.unwrap()],
normal: data.normal[vert.2.unwrap()], normal: data.normal[vert.2.unwrap()],
}); });
vertex_index.insert(vert,i); vertex_index.insert(vert,i);
@ -353,7 +355,7 @@ impl strafe_client::framework::Example for Skybox {
buffers: &[wgpu::VertexBufferLayout { buffers: &[wgpu::VertexBufferLayout {
array_stride: std::mem::size_of::<Vertex>() as wgpu::BufferAddress, array_stride: std::mem::size_of::<Vertex>() as wgpu::BufferAddress,
step_mode: wgpu::VertexStepMode::Vertex, step_mode: wgpu::VertexStepMode::Vertex,
attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x3], attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3],
}], }],
}, },
fragment: Some(wgpu::FragmentState { fragment: Some(wgpu::FragmentState {

View File

@ -63,7 +63,8 @@ fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput {
struct EntityOutput { struct EntityOutput {
@builtin(position) position: vec4<f32>, @builtin(position) position: vec4<f32>,
@location(1) normal: vec3<f32>, @location(1) texture: vec2<f32>,
@location(2) normal: vec3<f32>,
@location(3) view: vec3<f32>, @location(3) view: vec3<f32>,
}; };
@ -74,11 +75,13 @@ var<uniform> r_EntityTransform: mat4x4<f32>;
@vertex @vertex
fn vs_entity( fn vs_entity(
@location(0) pos: vec3<f32>, @location(0) pos: vec3<f32>,
@location(1) normal: vec3<f32>, @location(1) texture: vec2<f32>,
@location(2) normal: vec3<f32>,
) -> EntityOutput { ) -> EntityOutput {
var position: vec4<f32> = r_EntityTransform * vec4<f32>(pos, 1.0); var position: vec4<f32> = r_EntityTransform * vec4<f32>(pos, 1.0);
var result: EntityOutput; var result: EntityOutput;
result.normal = (r_EntityTransform * vec4<f32>(normal, 0.0)).xyz; result.normal = (r_EntityTransform * vec4<f32>(normal, 0.0)).xyz;
result.texture=texture;
result.view = position.xyz - r_data.cam_pos.xyz; result.view = position.xyz - r_data.cam_pos.xyz;
result.position = r_data.proj * r_data.view * position; result.position = r_data.proj * r_data.view * position;
return result; return result;
@ -100,10 +103,13 @@ fn fs_sky(vertex: SkyOutput) -> @location(0) vec4<f32> {
fn fs_entity(vertex: EntityOutput) -> @location(0) vec4<f32> { fn fs_entity(vertex: EntityOutput) -> @location(0) vec4<f32> {
let incident = normalize(vertex.view); let incident = normalize(vertex.view);
let normal = normalize(vertex.normal); let normal = normalize(vertex.normal);
let reflected = incident - 2.0 * dot(normal, incident) * normal; let d = dot(normal, incident);
let reflected = incident - 2.0 * d * normal;
let dir = vec3<f32>(-1.0)+2.0*vec3<f32>(vertex.texture.x,0.0,vertex.texture.y);
let texture_color = textureSample(r_texture, r_sampler, dir).rgb;
let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb;
return vec4<f32>(vec3<f32>(0.1) + 0.5 * reflected_color, 1.0); return vec4<f32>(mix(vec3<f32>(0.1) + 0.5 * reflected_color,texture_color,abs(d)), 1.0);
} }
fn modulo_euclidean (a: f32, b: f32) -> f32 { fn modulo_euclidean (a: f32, b: f32) -> f32 {