broken fpscontrols
This commit is contained in:
parent
29e8eff82a
commit
298822e197
@ -36,16 +36,20 @@ out vec4 FragColor;
|
|||||||
vec3 albedo;
|
vec3 albedo;
|
||||||
float depth;
|
float depth;
|
||||||
vec3 normal;
|
vec3 normal;
|
||||||
vec3 material; // specular, roughness, metalic
|
vec3 material; // specular, roughness, metalic
|
||||||
vec3 position;
|
vec3 position;
|
||||||
|
|
||||||
|
float specular;
|
||||||
|
float roughness;
|
||||||
|
float metalic;
|
||||||
|
|
||||||
vec3 calc_light(light_t light) {
|
vec3 calc_light(light_t light) {
|
||||||
vec3 light_dir = normalize(light.position - position);
|
vec3 light_dir = normalize(light.position - position);
|
||||||
vec3 view_dir = normalize(view_pos - position);
|
vec3 view_dir = normalize(view_pos - position);
|
||||||
vec3 reflect_dir = reflect(-light_dir, normal);
|
vec3 reflect_dir = reflect(-light_dir, normal);
|
||||||
|
|
||||||
float diffuse = max(dot(normal, light_dir), 0.0);
|
float diffuse = max(dot(normal, light_dir), 0.0);
|
||||||
float specular = pow(max(dot(view_dir, reflect_dir), 0.0), 1 - material.y) * material.x;
|
float specular = pow(max(dot(view_dir, reflect_dir), 0.0), 1 - roughness) * specular;
|
||||||
|
|
||||||
return (diffuse + specular) * light.intensity * light.color / max(pow(length(light.position - position), 2), 1);
|
return (diffuse + specular) * light.intensity * light.color / max(pow(length(light.position - position), 2), 1);
|
||||||
}
|
}
|
||||||
@ -53,8 +57,13 @@ vec3 calc_light(light_t light) {
|
|||||||
void main() {
|
void main() {
|
||||||
albedo = texture(s_albedo, tex).rgb;
|
albedo = texture(s_albedo, tex).rgb;
|
||||||
depth = texture(s_depth, tex).x;
|
depth = texture(s_depth, tex).x;
|
||||||
normal = (texture(s_normal, tex).rgb * 2) - 1;
|
normal = (texture(s_normal, tex).rgb * 0.5) + 0.5;
|
||||||
material = texture(s_material, tex).xyz;
|
material = texture(s_material, tex).xyz;
|
||||||
|
{
|
||||||
|
specular = material.x;
|
||||||
|
roughness = material.y;
|
||||||
|
metalic = material.z;
|
||||||
|
}
|
||||||
position = texture(s_position, tex).xyz;
|
position = texture(s_position, tex).xyz;
|
||||||
|
|
||||||
vec3 light_result;
|
vec3 light_result;
|
||||||
|
29
main.go
29
main.go
@ -10,6 +10,7 @@ import (
|
|||||||
"git.tek.govt.hu/dowerx/opengl-deferred/types/light"
|
"git.tek.govt.hu/dowerx/opengl-deferred/types/light"
|
||||||
"git.tek.govt.hu/dowerx/opengl-deferred/types/shader"
|
"git.tek.govt.hu/dowerx/opengl-deferred/types/shader"
|
||||||
"git.tek.govt.hu/dowerx/opengl-deferred/types/texture"
|
"git.tek.govt.hu/dowerx/opengl-deferred/types/texture"
|
||||||
|
"git.tek.govt.hu/dowerx/opengl-deferred/utils/fpscontrols"
|
||||||
"github.com/go-gl/gl/v4.6-core/gl"
|
"github.com/go-gl/gl/v4.6-core/gl"
|
||||||
"github.com/go-gl/glfw/v3.3/glfw"
|
"github.com/go-gl/glfw/v3.3/glfw"
|
||||||
"github.com/go-gl/mathgl/mgl32"
|
"github.com/go-gl/mathgl/mgl32"
|
||||||
@ -88,7 +89,7 @@ func main() {
|
|||||||
defer screenShader.Delete()
|
defer screenShader.Delete()
|
||||||
|
|
||||||
// geometry
|
// geometry
|
||||||
cube, err := geometry.LoadOBJ("assets/geometries/cube.obj")
|
cube, err := geometry.LoadOBJ("assets/geometries/suzanne.obj")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -133,7 +134,8 @@ func main() {
|
|||||||
|
|
||||||
// lights
|
// lights
|
||||||
lights := []light.Light{
|
lights := []light.Light{
|
||||||
{Color: [3]float32{1, 1, 1}, Position: mgl32.Vec3{3, 3, 3}, Intensity: 10, Type: light.POINT},
|
{Color: [3]float32{0, 1, 0}, Position: mgl32.Vec3{3, 3, 3}, Intensity: 3, Type: light.POINT},
|
||||||
|
{Color: [3]float32{1, 0, 1}, Position: mgl32.Vec3{3, 3, -3}, Intensity: 15, Type: light.POINT},
|
||||||
}
|
}
|
||||||
|
|
||||||
// gbuffer
|
// gbuffer
|
||||||
@ -145,20 +147,13 @@ func main() {
|
|||||||
gbuff.Bind()
|
gbuff.Bind()
|
||||||
|
|
||||||
// transformations
|
// transformations
|
||||||
projection := mgl32.Perspective(mgl32.DegToRad(FOV), float32(WIDTH)/HEIGHT, 0.1, 10)
|
projection := mgl32.Perspective(mgl32.DegToRad(FOV), float32(WIDTH)/HEIGHT, 0.1, 1000)
|
||||||
viewPositon := mgl32.Vec3{3, 3, 3}
|
model := mgl32.Ident4()
|
||||||
view := mgl32.LookAtV(viewPositon, mgl32.Vec3{0, 0, 0}, mgl32.Vec3{0, 1, 0})
|
controls := fpscontrols.New(1, 0.1, mgl32.Vec3{0, 0, -10}, 0, 0, window)
|
||||||
|
|
||||||
angle := 0.0
|
|
||||||
previousTime := glfw.GetTime()
|
|
||||||
for !window.ShouldClose() {
|
for !window.ShouldClose() {
|
||||||
// rotate
|
glfw.PollEvents()
|
||||||
time := glfw.GetTime()
|
controls.Update()
|
||||||
elapsed := time - previousTime
|
|
||||||
previousTime = time
|
|
||||||
|
|
||||||
angle += elapsed
|
|
||||||
model := mgl32.HomogRotate3D(float32(angle), mgl32.Vec3{0, 1, 0})
|
|
||||||
|
|
||||||
// first pass
|
// first pass
|
||||||
// bind textures
|
// bind textures
|
||||||
@ -177,7 +172,7 @@ func main() {
|
|||||||
// transfer uniforms
|
// transfer uniforms
|
||||||
deferredShader.Use()
|
deferredShader.Use()
|
||||||
deferredShader.Mat4("projection", projection)
|
deferredShader.Mat4("projection", projection)
|
||||||
deferredShader.Mat4("view", view)
|
deferredShader.Mat4("view", controls.ViewMatrix())
|
||||||
deferredShader.Mat4("model", model)
|
deferredShader.Mat4("model", model)
|
||||||
|
|
||||||
deferredShader.Int("s_albedo", 0)
|
deferredShader.Int("s_albedo", 0)
|
||||||
@ -200,7 +195,8 @@ func main() {
|
|||||||
screenShader.Int("s_normal", 2)
|
screenShader.Int("s_normal", 2)
|
||||||
screenShader.Int("s_material", 3)
|
screenShader.Int("s_material", 3)
|
||||||
screenShader.Int("s_position", 4)
|
screenShader.Int("s_position", 4)
|
||||||
screenShader.Vec3("view_pos", &viewPositon[0])
|
pos := controls.Position()
|
||||||
|
screenShader.Vec3("view_pos", &pos[0])
|
||||||
|
|
||||||
for _, light := range lights {
|
for _, light := range lights {
|
||||||
screenShader.Light(&light)
|
screenShader.Light(&light)
|
||||||
@ -209,7 +205,6 @@ func main() {
|
|||||||
screen.Draw()
|
screen.Draw()
|
||||||
|
|
||||||
window.SwapBuffers()
|
window.SwapBuffers()
|
||||||
glfw.PollEvents()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defer fmt.Println("exiting...")
|
defer fmt.Println("exiting...")
|
||||||
|
77
utils/fpscontrols/fpscontrols.go
Normal file
77
utils/fpscontrols/fpscontrols.go
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package fpscontrols
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/go-gl/glfw/v3.3/glfw"
|
||||||
|
"github.com/go-gl/mathgl/mgl32"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FPSControls struct {
|
||||||
|
lookSpeed float32
|
||||||
|
moveSpeed float32
|
||||||
|
|
||||||
|
position mgl32.Vec3
|
||||||
|
rotation mgl32.Vec2
|
||||||
|
|
||||||
|
currentMove mgl32.Vec3
|
||||||
|
currentLook mgl32.Vec2
|
||||||
|
lastMousePos mgl32.Vec2
|
||||||
|
}
|
||||||
|
|
||||||
|
var instance *FPSControls
|
||||||
|
|
||||||
|
func Get(lookSpeed, moveSpeed float32, position mgl32.Vec3, rotation mgl32.Vec2, window *glfw.Window) *FPSControls {
|
||||||
|
if instance != nil {
|
||||||
|
return instance
|
||||||
|
}
|
||||||
|
|
||||||
|
instance = &FPSControls{
|
||||||
|
moveSpeed: moveSpeed,
|
||||||
|
lookSpeed: lookSpeed,
|
||||||
|
position: position,
|
||||||
|
rotation: rotation,
|
||||||
|
}
|
||||||
|
|
||||||
|
window.SetKeyCallback(func(window *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) {
|
||||||
|
var val float32
|
||||||
|
|
||||||
|
switch action {
|
||||||
|
case glfw.Repeat:
|
||||||
|
return
|
||||||
|
case glfw.Press:
|
||||||
|
val = 1
|
||||||
|
case glfw.Release:
|
||||||
|
val = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case glfw.KeyW:
|
||||||
|
instance.currentMove[2] = -val
|
||||||
|
case glfw.KeyS:
|
||||||
|
instance.currentMove[2] = val
|
||||||
|
case glfw.KeyA:
|
||||||
|
instance.currentMove[0] = -val
|
||||||
|
case glfw.KeyD:
|
||||||
|
instance.currentMove[0] = val
|
||||||
|
case glfw.KeySpace:
|
||||||
|
instance.currentMove[1] = -val
|
||||||
|
case glfw.KeyLeftShift:
|
||||||
|
instance.currentMove[1] = val
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
window.SetCursorPosCallback(func(window *glfw.Window, x float64, y float64) {
|
||||||
|
pos := mgl32.Vec2{float32(x), float32(y)}
|
||||||
|
instance.currentLook = instance.lastMousePos.Sub(pos)
|
||||||
|
instance.lastMousePos = pos
|
||||||
|
})
|
||||||
|
|
||||||
|
return instance
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *FPSControls) forward() mgl32.Vec3 {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *FPSControls) View() mgl32.Mat4 {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user