texture coordinates + fake fresnel using dot
This commit is contained in:
parent
5fb9f8b1bc
commit
8aad878d49
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user