Switch computers
ci/woodpecker/push/build Pipeline failed
Details
ci/woodpecker/push/build Pipeline failed
Details
This commit is contained in:
parent
e23d4dc731
commit
b2bbbbbfad
|
@ -1,9 +1,27 @@
|
||||||
use std::sync::Arc;
|
use super::texture::RenderTexture;
|
||||||
|
|
||||||
use lyra_resource::{Texture, Resource};
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Material {
|
pub struct Material {
|
||||||
pub shader_id: u32,
|
pub shader_id: u64,
|
||||||
pub texture: Arc<Resource<Texture>>,
|
pub diffuse_texture: RenderTexture,
|
||||||
|
pub ambient: glam::Vec3,
|
||||||
|
pub diffuse: glam::Vec3,
|
||||||
|
pub specular: glam::Vec3,
|
||||||
|
pub shininess: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Material {
|
||||||
|
pub fn from_resource(device: &wgpu::Device, queue: &wgpu::Queue, value: &lyra_resource::Material) -> Self {
|
||||||
|
let image = value.base_color_texture.as_ref().map(|t| &t.data.as_ref().unwrap().image).unwrap();
|
||||||
|
let diffuse_texture = RenderTexture::from_image(device, queue, image, None).unwrap();
|
||||||
|
|
||||||
|
Self {
|
||||||
|
shader_id: value.shader_uuid.unwrap_or(0),
|
||||||
|
diffuse_texture,
|
||||||
|
ambient: glam::Vec3::new(1.0, 0.5, 0.31),
|
||||||
|
diffuse: glam::Vec3::new(value.base_color.x, value.base_color.y, value.base_color.z),
|
||||||
|
specular: glam::Vec3::new(0.5, 0.5, 0.5),
|
||||||
|
shininess: 32.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -2,11 +2,12 @@ use edict::EntityId;
|
||||||
|
|
||||||
use crate::math::Transform;
|
use crate::math::Transform;
|
||||||
|
|
||||||
|
use super::material::Material;
|
||||||
|
|
||||||
pub struct RenderJob {
|
pub struct RenderJob {
|
||||||
pub entity: EntityId,
|
pub entity: EntityId,
|
||||||
pub shader_id: u64,
|
pub shader_id: u64,
|
||||||
pub mesh_buffer_id: uuid::Uuid,
|
pub mesh_buffer_id: uuid::Uuid,
|
||||||
|
|
||||||
pub transform: Transform,
|
pub transform: Transform,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ use crate::render::light::PointLightUniform;
|
||||||
use super::camera::{RenderCamera, CameraUniform};
|
use super::camera::{RenderCamera, CameraUniform};
|
||||||
use super::desc_buf_lay::DescVertexBufferLayout;
|
use super::desc_buf_lay::DescVertexBufferLayout;
|
||||||
use super::light::{PointLight, LightUniformBuffers};
|
use super::light::{PointLight, LightUniformBuffers};
|
||||||
|
use super::material::Material;
|
||||||
use super::texture::RenderTexture;
|
use super::texture::RenderTexture;
|
||||||
use super::transform_buffer_storage::{TransformBufferIndices, TransformBuffers};
|
use super::transform_buffer_storage::{TransformBufferIndices, TransformBuffers};
|
||||||
use super::vertex::Vertex;
|
use super::vertex::Vertex;
|
||||||
|
@ -43,8 +44,9 @@ struct MeshBufferStorage {
|
||||||
buffer_vertex: BufferStorage,
|
buffer_vertex: BufferStorage,
|
||||||
buffer_indices: Option<(wgpu::IndexFormat, BufferStorage)>,
|
buffer_indices: Option<(wgpu::IndexFormat, BufferStorage)>,
|
||||||
|
|
||||||
#[allow(dead_code)]
|
//#[allow(dead_code)]
|
||||||
render_texture: Option<RenderTexture>,
|
//render_texture: Option<RenderTexture>,
|
||||||
|
material: Option<Material>,
|
||||||
texture_bindgroup: Option<BindGroup>,
|
texture_bindgroup: Option<BindGroup>,
|
||||||
|
|
||||||
// The index of the transform for this entity.
|
// The index of the transform for this entity.
|
||||||
|
@ -89,6 +91,9 @@ pub struct BasicRenderer {
|
||||||
default_texture_bind_group: BindGroup,
|
default_texture_bind_group: BindGroup,
|
||||||
depth_buffer_texture: RenderTexture,
|
depth_buffer_texture: RenderTexture,
|
||||||
|
|
||||||
|
material_buffer: wgpu::Buffer,
|
||||||
|
material_bind_group: wgpu::BindGroup,
|
||||||
|
|
||||||
light_buffers: LightUniformBuffers,
|
light_buffers: LightUniformBuffers,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,8 +385,8 @@ impl BasicRenderer {
|
||||||
let (vertex_buffer, buffer_indices) = self.create_vertex_index_buffers(mesh);
|
let (vertex_buffer, buffer_indices) = self.create_vertex_index_buffers(mesh);
|
||||||
|
|
||||||
let diffuse_bindgroup = if let Some(model_texture) = &mesh.material().base_color_texture {
|
let diffuse_bindgroup = if let Some(model_texture) = &mesh.material().base_color_texture {
|
||||||
let image = &model_texture.data.as_ref().unwrap().image;
|
let material = Material::from_resource(&self.device, &self.queue, &mesh.material());
|
||||||
let diffuse_texture = RenderTexture::from_image(&self.device, &self.queue, image, None).unwrap();
|
let diffuse_texture = &material.diffuse_texture;
|
||||||
|
|
||||||
let diffuse_bind_group = self.device.create_bind_group(
|
let diffuse_bind_group = self.device.create_bind_group(
|
||||||
&wgpu::BindGroupDescriptor {
|
&wgpu::BindGroupDescriptor {
|
||||||
|
@ -408,7 +413,7 @@ impl BasicRenderer {
|
||||||
MeshBufferStorage {
|
MeshBufferStorage {
|
||||||
buffer_vertex: vertex_buffer,
|
buffer_vertex: vertex_buffer,
|
||||||
buffer_indices,
|
buffer_indices,
|
||||||
render_texture: None,
|
material: None,
|
||||||
texture_bindgroup: diffuse_bindgroup,
|
texture_bindgroup: diffuse_bindgroup,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,46 +64,56 @@ fn vs_main(
|
||||||
|
|
||||||
// Fragment shader
|
// Fragment shader
|
||||||
|
|
||||||
|
struct Material {
|
||||||
|
ambient: vec3<f32>,
|
||||||
|
diffuse: vec3<f32>,
|
||||||
|
specular: vec3<f32>,
|
||||||
|
shininess: f32,
|
||||||
|
}
|
||||||
|
|
||||||
@group(0) @binding(0)
|
@group(0) @binding(0)
|
||||||
var t_diffuse: texture_2d<f32>;
|
var t_diffuse: texture_2d<f32>;
|
||||||
@group(0)@binding(1)
|
@group(0) @binding(1)
|
||||||
var s_diffuse: sampler;
|
var s_diffuse: sampler;
|
||||||
|
|
||||||
|
@group(4) @binding(0)
|
||||||
|
var u_material: Material;
|
||||||
|
|
||||||
@fragment
|
@fragment
|
||||||
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
|
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
|
||||||
let object_color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords);
|
let object_color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords);
|
||||||
|
|
||||||
var light_res = vec3<f32>(0.0);
|
var light_res = vec3<f32>(0.0);
|
||||||
for (var i = 0u; i < u_lights.point_light_count; i++) {
|
for (var i = 0u; i < u_lights.point_light_count; i++) {
|
||||||
light_res += blinn_phong_point_light(in.world_position, in.world_normal, u_lights.point_lights[i]);
|
light_res += blinn_phong_point_light(in.world_position, in.world_normal, u_lights.point_lights[i], u_material);
|
||||||
}
|
}
|
||||||
let light_object_res = light_res * object_color.xyz;
|
let light_object_res = light_res * object_color.xyz;
|
||||||
|
|
||||||
return vec4<f32>(light_object_res, object_color.a);
|
return vec4<f32>(light_object_res, object_color.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn blinn_phong_point_light(world_pos: vec3<f32>, world_norm: vec3<f32>, point_light: PointLight) -> vec3<f32> {
|
fn blinn_phong_point_light(world_pos: vec3<f32>, world_norm: vec3<f32>, point_light: PointLight, material: Material) -> vec3<f32> {
|
||||||
let light_color = point_light.color.xyz;
|
let light_color = point_light.color.xyz;
|
||||||
let light_pos = point_light.position.xyz;
|
let light_pos = point_light.position.xyz;
|
||||||
let camera_view_pos = u_camera.view_pos.xyz;
|
let camera_view_pos = u_camera.view_pos.xyz;
|
||||||
|
|
||||||
// We don't need (or want) much ambient light, so 0.1 is fine
|
// We don't need (or want) much ambient light, so 0.1 is fine
|
||||||
let ambient_strength = 0.1;
|
//let ambient_strength = 0.1;
|
||||||
var ambient_color = light_color * ambient_strength;
|
var ambient_color = light_color * material.ambient;
|
||||||
|
|
||||||
//// diffuse ////
|
//// diffuse ////
|
||||||
let light_dir = normalize(light_pos - world_pos);
|
let light_dir = normalize(light_pos - world_pos);
|
||||||
|
|
||||||
let diffuse_strength = max(dot(world_norm, light_dir), 0.0);
|
let diffuse_strength = max(dot(world_norm, light_dir), 0.0);
|
||||||
var diffuse_color = light_color * diffuse_strength;
|
var diffuse_color = light_color * (diffuse_strength * material.diffuse);
|
||||||
//// end of diffuse ////
|
//// end of diffuse ////
|
||||||
|
|
||||||
//// specular ////
|
//// specular ////
|
||||||
let view_dir = normalize(camera_view_pos - world_pos);
|
let view_dir = normalize(camera_view_pos - world_pos);
|
||||||
let half_dir = normalize(view_dir + light_dir);
|
let half_dir = normalize(view_dir + light_dir);
|
||||||
|
|
||||||
let specular_strength = pow(max(dot(world_norm, half_dir), 0.0), 32.0);
|
let specular_strength = pow(max(dot(world_norm, half_dir), 0.0), material.shininess);
|
||||||
var specular_color = specular_strength * light_color;
|
var specular_color = specular_strength * (light_color * material.specular);
|
||||||
//// end of specular ////
|
//// end of specular ////
|
||||||
|
|
||||||
//// point light attenuation ////
|
//// point light attenuation ////
|
||||||
|
|
Loading…
Reference in New Issue