Better lighting, culling
This commit is contained in:
+14
-9
@@ -28,10 +28,12 @@ const uint MAX_STEPS=50;
|
||||
vec3 shading(vec3 normal)
|
||||
{
|
||||
vec3 accum=vec3(0.,0.,0.);
|
||||
mat3 rotation=mat3(pc.world[0].xyz,pc.world[1].xyz,pc.world[2].xyz);
|
||||
vec3 position=pc.world[3].xyz;
|
||||
|
||||
for(int i=0;i<light_uniforms.light_count;i++)
|
||||
{
|
||||
accum+=light_uniforms.col[i].xyz*((dot(normalize(normal),light_uniforms.pos[i].xyz)*.5)+.5);
|
||||
accum+=light_uniforms.col[i].xyz*((dot(normalize(rotation*normal),normalize(light_uniforms.pos[i].xyz-position))*.5)+.5);
|
||||
}
|
||||
|
||||
return accum;
|
||||
@@ -69,15 +71,19 @@ void main(){
|
||||
default_mask();
|
||||
vec3 raypos=vertexInput.position.xyz;
|
||||
vec2 iResolution=vec2(RES_X,RES_Y);
|
||||
vec2 iuv=(gl_FragCoord.xy+gl_SamplePosition)/iResolution.xy*2.-1.;
|
||||
//#ifdef ssaa
|
||||
//vec2 iuv=(gl_FragCoord.xy+gl_SamplePosition)/iResolution.xy*2.-1.;
|
||||
//#else
|
||||
vec2 iuv=(gl_FragCoord.xy)/iResolution.xy*2.-1.;
|
||||
//#endif
|
||||
vec2 uv=iuv;
|
||||
uv.x*=iResolution.x/iResolution.y;
|
||||
vec3 p;
|
||||
vec3 raydir=normalize(raypos-camera_uniforms.campos);
|
||||
raypos-=vec3(5);
|
||||
//scene(raypos,false);
|
||||
//f_color=vec4(scene(raypos,false),1.);
|
||||
///return;
|
||||
vec3 raydir=normalize(raypos-(inverse(pc.world)*vec4(camera_uniforms.campos,1)).xyz);
|
||||
//raypos-=vec3(5);
|
||||
|
||||
//f_color=vec4(raydir,1.);
|
||||
//return;
|
||||
|
||||
vec2 td=spheretracing(raypos,raydir,p);
|
||||
vec3 n=getNormal(p,td.y);
|
||||
@@ -86,9 +92,8 @@ void main(){
|
||||
f_color=vec4(1.);
|
||||
f_color=vec4(shading(n),1.);
|
||||
|
||||
vec4 tpoint=camera_uniforms.proj*camera_uniforms.view*vec4(p,1);
|
||||
vec4 tpoint=camera_uniforms.proj*camera_uniforms.view*pc.world*vec4(p,1);
|
||||
gl_FragDepth=(tpoint.z/tpoint.w);
|
||||
//gl_FragDepth=gl_DepthRange.diff*(((tpoint.z/tpoint.w)+1.)*.5)+gl_DepthRange.near;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+10
@@ -63,6 +63,16 @@ pub fn gui_up(gui: &mut Gui, state: &mut GState) {
|
||||
ui.add(egui::Slider::new(&mut mesh.rot.y.0, 0.0..=360.0).text("Rotation.y"));
|
||||
ui.add(egui::Slider::new(&mut mesh.rot.z.0, 0.0..=360.0).text("Rotation.z"));
|
||||
}
|
||||
ui.heading("Implicit Surfaces");
|
||||
for csg in &mut state.csg {
|
||||
ui.label(csg.name.clone());
|
||||
ui.add(egui::Slider::new(&mut csg.pos.x, -100.0..=100.0).text("Position.x"));
|
||||
ui.add(egui::Slider::new(&mut csg.pos.y, -100.0..=100.0).text("Position.y"));
|
||||
ui.add(egui::Slider::new(&mut csg.pos.z, -100.0..=100.0).text("Position.z"));
|
||||
ui.add(egui::Slider::new(&mut csg.rot.x.0, 0.0..=360.0).text("Rotation.x"));
|
||||
ui.add(egui::Slider::new(&mut csg.rot.y.0, 0.0..=360.0).text("Rotation.y"));
|
||||
ui.add(egui::Slider::new(&mut csg.rot.z.0, 0.0..=360.0).text("Rotation.z"));
|
||||
}
|
||||
ui.heading("Lights");
|
||||
for light in &mut state.lights {
|
||||
ui.label("Light");
|
||||
|
||||
+51
-44
@@ -14,21 +14,15 @@ layout(location=0)out VertexOutput
|
||||
}vertexOutput[];
|
||||
|
||||
const vec4[8]positions={
|
||||
vec4(0.,0.,0.,1.),
|
||||
vec4(0.,0.,1.,1.),
|
||||
vec4(0.,1.,0.,1.),
|
||||
vec4(0.,1.,1.,1.),
|
||||
vec4(1.,0.,0.,1.),
|
||||
vec4(1.,0.,1.,1.),
|
||||
vec4(1.,1.,0.,1.),
|
||||
vec4(1.,1.,1.,1.),
|
||||
vec4(-.5,-.5,-.5,1.),
|
||||
vec4(-.5,-.5,.5,1.),
|
||||
vec4(-.5,.5,-.5,1.),
|
||||
vec4(-.5,.5,.5,1.),
|
||||
vec4(.5,-.5,-.5,1.),
|
||||
vec4(.5,-.5,.5,1.),
|
||||
vec4(.5,.5,-.5,1.),
|
||||
vec4(.5,.5,.5,1.),
|
||||
};
|
||||
const mat4 scale=mat4(
|
||||
10.,0.,0.,0.,
|
||||
0.,10.,0.,0.,
|
||||
0.,0.,10.,0.,
|
||||
0.,0.,0.,1.
|
||||
);
|
||||
|
||||
void main()
|
||||
{
|
||||
@@ -36,34 +30,47 @@ void main()
|
||||
|
||||
vec4 offset=vec4(0.,0.,gl_GlobalInvocationID.x,0.);
|
||||
|
||||
SetMeshOutputsEXT(8,12);
|
||||
mat4 mvp=camera_uniforms.proj*camera_uniforms.view*scale;
|
||||
gl_MeshVerticesEXT[0].gl_Position=mvp*(positions[0]+offset);
|
||||
gl_MeshVerticesEXT[1].gl_Position=mvp*(positions[1]+offset);
|
||||
gl_MeshVerticesEXT[2].gl_Position=mvp*(positions[2]+offset);
|
||||
gl_MeshVerticesEXT[3].gl_Position=mvp*(positions[3]+offset);
|
||||
gl_MeshVerticesEXT[4].gl_Position=mvp*(positions[4]+offset);
|
||||
gl_MeshVerticesEXT[5].gl_Position=mvp*(positions[5]+offset);
|
||||
gl_MeshVerticesEXT[6].gl_Position=mvp*(positions[6]+offset);
|
||||
gl_MeshVerticesEXT[7].gl_Position=mvp*(positions[7]+offset);
|
||||
vertexOutput[0].position=scale*positions[0];
|
||||
vertexOutput[1].position=scale*positions[1];
|
||||
vertexOutput[2].position=scale*positions[2];
|
||||
vertexOutput[3].position=scale*positions[3];
|
||||
vertexOutput[4].position=scale*positions[4];
|
||||
vertexOutput[5].position=scale*positions[5];
|
||||
vertexOutput[6].position=scale*positions[6];
|
||||
vertexOutput[7].position=scale*positions[7];
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(0,1,2);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(1,2,3);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(4,5,6);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(5,6,7);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(0,2,4);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(2,4,6);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+6]=uvec3(1,3,5);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+7]=uvec3(3,5,7);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+8]=uvec3(2,3,6);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+9]=uvec3(3,6,7);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+10]=uvec3(0,1,4);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+11]=uvec3(1,4,5);
|
||||
vec3 signingvec=sign((inverse(pc.world)*vec4(camera_uniforms.campos,1)).xyz);
|
||||
|
||||
SetMeshOutputsEXT(8,6);
|
||||
mat4 mvp=camera_uniforms.proj*camera_uniforms.view*pc.world;
|
||||
//mat4 sw=pc.world;
|
||||
gl_MeshVerticesEXT[0].gl_Position=mvp*(positions[0]);
|
||||
gl_MeshVerticesEXT[1].gl_Position=mvp*(positions[1]);
|
||||
gl_MeshVerticesEXT[2].gl_Position=mvp*(positions[2]);
|
||||
gl_MeshVerticesEXT[3].gl_Position=mvp*(positions[3]);
|
||||
gl_MeshVerticesEXT[4].gl_Position=mvp*(positions[4]);
|
||||
gl_MeshVerticesEXT[5].gl_Position=mvp*(positions[5]);
|
||||
gl_MeshVerticesEXT[6].gl_Position=mvp*(positions[6]);
|
||||
gl_MeshVerticesEXT[7].gl_Position=mvp*(positions[7]);
|
||||
vertexOutput[0].position=(positions[0]);
|
||||
vertexOutput[1].position=(positions[1]);
|
||||
vertexOutput[2].position=(positions[2]);
|
||||
vertexOutput[3].position=(positions[3]);
|
||||
vertexOutput[4].position=(positions[4]);
|
||||
vertexOutput[5].position=(positions[5]);
|
||||
vertexOutput[6].position=(positions[6]);
|
||||
vertexOutput[7].position=(positions[7]);
|
||||
|
||||
if(signingvec.x>0){
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(4,5,6);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(5,6,7);
|
||||
}else{
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(0,1,2);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(1,2,3);
|
||||
}
|
||||
if(signingvec.y>0){
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(2,3,6);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(7,3,6);
|
||||
}else{
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(0,1,4);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(5,1,4);
|
||||
}
|
||||
if(signingvec.z>0){
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(1,3,5);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(3,5,7);
|
||||
}else{
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(0,2,4);
|
||||
gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(2,4,6);
|
||||
}
|
||||
}
|
||||
+37
-33
@@ -89,7 +89,7 @@ fn main() {
|
||||
|
||||
let event_loop = EventLoop::new();
|
||||
let surface = WindowBuilder::new()
|
||||
.with_title("horizontally spinning bunny")
|
||||
.with_title("Implicit Surfaces")
|
||||
.build_vk_surface(&event_loop, instance.clone())
|
||||
.unwrap();
|
||||
|
||||
@@ -124,7 +124,7 @@ fn main() {
|
||||
_ => 5,
|
||||
}
|
||||
})
|
||||
.expect("No suitable physical device found");
|
||||
.expect("No suitable physical device found. Do you have a Mesh Shader capable GPU and are your drivers up to date?");
|
||||
|
||||
// Some little debug infos.
|
||||
println!(
|
||||
@@ -402,10 +402,10 @@ fn main() {
|
||||
|
||||
gstate
|
||||
.lights
|
||||
.push(Light::new([4., 6., 8.], [1., 1., 8.], 0.01));
|
||||
.push(Light::new([4., 6., 8.], [1., 1., 8.], 0.05));
|
||||
gstate
|
||||
.lights
|
||||
.push(Light::new([-4., 6., -8.], [8., 4., 1.], 0.01));
|
||||
.push(Light::new([-4., 6., -8.], [8., 4., 1.], 0.05));
|
||||
|
||||
event_loop.run(move |event, _, control_flow| {
|
||||
if let Event::WindowEvent { event: we, .. } = &event {
|
||||
@@ -517,28 +517,28 @@ fn main() {
|
||||
campos -= Matrix3::from_angle_y(camforward.y)
|
||||
* Matrix3::from_angle_x(camforward.x)
|
||||
* Vector3::unit_z()
|
||||
* 0.02
|
||||
* 0.01
|
||||
* gstate.move_speed;
|
||||
}
|
||||
if keys.s {
|
||||
campos += Matrix3::from_angle_y(camforward.y)
|
||||
* Matrix3::from_angle_x(camforward.x)
|
||||
* Vector3::unit_z()
|
||||
* 0.02
|
||||
* 0.01
|
||||
* gstate.move_speed;
|
||||
}
|
||||
if keys.a {
|
||||
campos += Matrix3::from_angle_y(camforward.y)
|
||||
* Matrix3::from_angle_x(camforward.x)
|
||||
* Vector3::unit_x()
|
||||
* 0.02
|
||||
* 0.01
|
||||
* gstate.move_speed;
|
||||
}
|
||||
if keys.d {
|
||||
campos -= Matrix3::from_angle_y(camforward.y)
|
||||
* Matrix3::from_angle_x(camforward.x)
|
||||
* Vector3::unit_x()
|
||||
* 0.02
|
||||
* 0.01
|
||||
* gstate.move_speed;
|
||||
}
|
||||
} else {
|
||||
@@ -559,11 +559,9 @@ fn main() {
|
||||
near,
|
||||
far,
|
||||
);
|
||||
let scale = 0.01;
|
||||
let view = Matrix4::from(camforward)
|
||||
* Matrix4::from_angle_z(Deg(180f32))
|
||||
* Matrix4::from_translation(Point3::origin() - campos)
|
||||
* Matrix4::from_scale(scale);
|
||||
* Matrix4::from_translation(Point3::origin() - campos);
|
||||
|
||||
let pc = mesh_vs::ty::PushConstantData {
|
||||
world: Matrix4::identity().into(),
|
||||
@@ -572,7 +570,7 @@ fn main() {
|
||||
let uniform_data = mesh_fs::ty::Camera {
|
||||
view: view.into(),
|
||||
proj: proj.into(),
|
||||
campos: (campos * (far - near)).into(),
|
||||
campos: (campos).into(),
|
||||
};
|
||||
|
||||
let sub = uniform_buffer.allocate_sized().unwrap();
|
||||
@@ -614,21 +612,21 @@ fn main() {
|
||||
|
||||
let parts = vec![
|
||||
CSGPart::literal(0i8.into()),
|
||||
CSGPart::literal(2i8.into()),
|
||||
CSGPart::literal(f16::from_f32(0.2)),
|
||||
CSGPart::literal(0i8.into()),
|
||||
CSGPart::opcode(InstructionSet::OPDupVec3),
|
||||
CSGPart::opcode(InstructionSet::OPPromoteFloatFloatFloatVec3),
|
||||
CSGPart::opcode(InstructionSet::OPSubVec3Vec3),
|
||||
CSGPart::literal(3i8.into()),
|
||||
CSGPart::literal(f16::from_f32(0.3)),
|
||||
CSGPart::opcode(InstructionSet::OPSDFSphere),
|
||||
CSGPart::literal(0i8.into()),
|
||||
CSGPart::literal(2i8.into()),
|
||||
CSGPart::literal(f16::from_f32(0.2)),
|
||||
CSGPart::literal(0i8.into()),
|
||||
CSGPart::opcode(InstructionSet::OPPromoteFloatFloatFloatVec3),
|
||||
CSGPart::opcode(InstructionSet::OPAddVec3Vec3),
|
||||
CSGPart::literal(3i8.into()),
|
||||
CSGPart::literal(f16::from_f32(0.3)),
|
||||
CSGPart::opcode(InstructionSet::OPSDFSphere),
|
||||
CSGPart::literal(f16::from_f32(0.5)),
|
||||
CSGPart::literal(f16::from_f32(0.05)),
|
||||
CSGPart::opcode(InstructionSet::OPSmoothMinFloat),
|
||||
CSGPart::opcode(InstructionSet::OPStop),
|
||||
];
|
||||
@@ -653,14 +651,7 @@ fn main() {
|
||||
}
|
||||
}
|
||||
|
||||
//01111101010101000000000000000000
|
||||
|
||||
/*data[0][0] = ((CSGPart::literal(5u8.into()).code as u32) << 0)
|
||||
| ((CSGPart::opcode(InstructionSet::OPSDFSphere).code as u32) << 16);
|
||||
data[0][1] = ((CSGPart::opcode(InstructionSet::OPStop).code as u32) << 16)
|
||||
| (CSGPart::opcode(InstructionSet::OPStop).code as u32);*/
|
||||
|
||||
println!("data: {:?}, {:?}", data[0][0], data[0][1]);
|
||||
//println!("data: {:?}, {:?}", data[0][0], data[0][1]);
|
||||
|
||||
let uniform_data = implicit_fs::ty::SceneDescription { d: data };
|
||||
|
||||
@@ -715,7 +706,7 @@ fn main() {
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let cb = gui.draw_on_subpass_image(dimensions.into());
|
||||
let guicb = gui.draw_on_subpass_image(dimensions.into());
|
||||
|
||||
builder
|
||||
.begin_render_pass(
|
||||
@@ -743,7 +734,7 @@ fn main() {
|
||||
|
||||
for object in &gstate.meshes {
|
||||
push_constants.world =
|
||||
(Matrix4::from_translation(object.pos - Point3::origin())
|
||||
(Matrix4::from_translation(object.pos * 0.01 - Point3::origin())
|
||||
* Matrix4::from(object.rot)
|
||||
* Matrix4::from_nonuniform_scale(
|
||||
object.scale.x,
|
||||
@@ -759,8 +750,6 @@ fn main() {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
push_constants.world = Matrix4::identity().into();
|
||||
|
||||
builder
|
||||
.bind_pipeline_graphics(implicit_pipeline.clone())
|
||||
.bind_descriptor_sets(
|
||||
@@ -768,15 +757,28 @@ fn main() {
|
||||
implicit_pipeline.layout().clone(),
|
||||
0,
|
||||
implicit_set,
|
||||
)
|
||||
.push_constants(implicit_pipeline.layout().clone(), 0, push_constants);
|
||||
);
|
||||
|
||||
builder.draw_mesh([1, 1, 1]).unwrap();
|
||||
for csg in &gstate.csg {
|
||||
push_constants.world =
|
||||
(Matrix4::from_translation(csg.pos * 0.01 - Point3::origin())
|
||||
* Matrix4::from(csg.rot)
|
||||
* Matrix4::from_nonuniform_scale(
|
||||
csg.scale.x,
|
||||
csg.scale.y,
|
||||
csg.scale.z,
|
||||
))
|
||||
.into();
|
||||
builder
|
||||
.push_constants(implicit_pipeline.layout().clone(), 0, push_constants)
|
||||
.draw_mesh([1, 1, 1])
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
builder
|
||||
.next_subpass(SubpassContents::SecondaryCommandBuffers)
|
||||
.unwrap()
|
||||
.execute_commands(cb)
|
||||
.execute_commands(guicb)
|
||||
.unwrap()
|
||||
.end_render_pass()
|
||||
.unwrap();
|
||||
@@ -926,6 +928,8 @@ where
|
||||
.mesh_shader(implicit_ms.entry_point("main").unwrap(), ())
|
||||
.depth_stencil_state(DepthStencilState::simple_depth_test())
|
||||
.rasterization_state(RasterizationState {
|
||||
//front_face: Fixed(Clockwise),
|
||||
//cull_mode: Fixed(CullMode::Back),
|
||||
..RasterizationState::default()
|
||||
})
|
||||
.multisample_state(MultisampleState {
|
||||
|
||||
@@ -9,5 +9,5 @@ layout(location=0)out vec3 v_normal;
|
||||
void main(){
|
||||
mat4 worldview=camera_uniforms.view*pc.world;
|
||||
v_normal=normal;//normalize(transpose(inverse(mat3(worldview))) * normal);
|
||||
gl_Position=camera_uniforms.proj*worldview*vec4(position*1000.,1.);
|
||||
gl_Position=camera_uniforms.proj*worldview*vec4(position,1.);
|
||||
}
|
||||
Reference in New Issue
Block a user