Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
E
Efficient Realtime Rendering of Complex Closed Form Implicit Surfaces Using Modern RTX Enabled GPUs
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
John Hunter
Efficient Realtime Rendering of Complex Closed Form Implicit Surfaces Using Modern RTX Enabled GPUs
Commits
ea771018
Unverified
Commit
ea771018
authored
2 years ago
by
John Hunter
Browse files
Options
Downloads
Patches
Plain Diff
Better lighting, culling
parent
56dc49f9
No related branches found
No related tags found
No related merge requests found
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
src/frag.glsl
+14
-9
14 additions, 9 deletions
src/frag.glsl
src/gui.rs
+10
-0
10 additions, 0 deletions
src/gui.rs
src/implicit.mesh.glsl
+51
-44
51 additions, 44 deletions
src/implicit.mesh.glsl
src/main.rs
+37
-33
37 additions, 33 deletions
src/main.rs
src/triangle.vert.glsl
+1
-1
1 addition, 1 deletion
src/triangle.vert.glsl
with
113 additions
and
87 deletions
src/frag.glsl
+
14
−
9
View file @
ea771018
...
...
@@ -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
{
...
...
This diff is collapsed.
Click to expand it.
src/gui.rs
+
10
−
0
View file @
ea771018
...
...
@@ -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"
);
...
...
This diff is collapsed.
Click to expand it.
src/implicit.mesh.glsl
+
51
−
44
View file @
ea771018
...
...
@@ -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
];
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
);
gl_PrimitiveTriangleIndicesEXT
[
gl_LocalInvocationIndex
+
2
]
=
uvec3
(
4
,
5
,
6
);
gl_PrimitiveTriangleIndicesEXT
[
gl_LocalInvocationIndex
+
3
]
=
uvec3
(
5
,
6
,
7
);
}
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
);
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
);
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/main.rs
+
37
−
33
View file @
ea771018
...
...
@@ -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.0
1
));
.push
(
Light
::
new
([
4.
,
6.
,
8.
],
[
1.
,
1.
,
8.
],
0.0
5
));
gstate
.lights
.push
(
Light
::
new
([
-
4.
,
6.
,
-
8.
],
[
8.
,
4.
,
1.
],
0.0
1
));
.push
(
Light
::
new
([
-
4.
,
6.
,
-
8.
],
[
8.
,
4.
,
1.
],
0.0
5
));
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.0
2
*
0.0
1
*
gstate
.move_speed
;
}
if
keys
.s
{
campos
+=
Matrix3
::
from_angle_y
(
camforward
.y
)
*
Matrix3
::
from_angle_x
(
camforward
.x
)
*
Vector3
::
unit_z
()
*
0.0
2
*
0.0
1
*
gstate
.move_speed
;
}
if
keys
.a
{
campos
+=
Matrix3
::
from_angle_y
(
camforward
.y
)
*
Matrix3
::
from_angle_x
(
camforward
.x
)
*
Vector3
::
unit_x
()
*
0.0
2
*
0.0
1
*
gstate
.move_speed
;
}
if
keys
.d
{
campos
-=
Matrix3
::
from_angle_y
(
camforward
.y
)
*
Matrix3
::
from_angle_x
(
camforward
.x
)
*
Vector3
::
unit_x
()
*
0.0
2
*
0.0
1
*
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.
0
5
)),
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
gui
cb
=
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
(
gui
cb
)
.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
{
...
...
This diff is collapsed.
Click to expand it.
src/triangle.vert.glsl
+
1
−
1
View file @
ea771018
...
...
@@ -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
.);
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment