shader.odin 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package shader
  2. import rl "vendor:raylib"
  3. import r3d "../r3d"
  4. main :: proc() {
  5. // Initialize window
  6. rl.InitWindow(800, 450, "[r3d] - Shader example")
  7. defer rl.CloseWindow()
  8. rl.SetTargetFPS(60)
  9. // Initialize R3D
  10. r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
  11. defer r3d.Close()
  12. // Setup environment
  13. env := r3d.GetEnvironment()
  14. env.ambient.color = {10, 10, 10, 255}
  15. env.bloom.mode = .ADDITIVE
  16. // Create meshes
  17. plane := r3d.GenMeshPlane(1000, 1000, 1, 1)
  18. defer r3d.UnloadMesh(plane)
  19. torus := r3d.GenMeshTorus(0.5, 0.1, 32, 16)
  20. defer r3d.UnloadMesh(torus)
  21. // Create material
  22. material := r3d.GetDefaultMaterial()
  23. material.shader = r3d.LoadSurfaceShader("./resources/shaders/material.glsl")
  24. defer r3d.UnloadSurfaceShader(material.shader)
  25. // Generate a texture for custom sampler
  26. image := rl.GenImageChecked(512, 512, 16, 32, rl.WHITE, rl.BLACK)
  27. texture := rl.LoadTextureFromImage(image)
  28. defer rl.UnloadTexture(texture)
  29. rl.UnloadImage(image)
  30. // Set custom sampler
  31. r3d.SetSurfaceShaderSampler(material.shader, "u_texture", texture)
  32. // Load a screen shader
  33. shader := r3d.LoadScreenShader("./resources/shaders/screen.glsl")
  34. defer r3d.UnloadScreenShader(shader)
  35. shaderPtr := shader
  36. r3d.SetScreenShaderChain(&shaderPtr, 1)
  37. // Create light
  38. light := r3d.CreateLight(.SPOT)
  39. r3d.LightLookAt(light, {0, 10, 5}, {0, 0, 0})
  40. r3d.EnableShadow(light)
  41. r3d.SetLightActive(light, true)
  42. // Setup camera
  43. camera: rl.Camera3D = {
  44. position = {0, 2, 2},
  45. target = {0, 0, 0},
  46. up = {0, 1, 0},
  47. fovy = 60,
  48. }
  49. // Main loop
  50. for !rl.WindowShouldClose()
  51. {
  52. rl.UpdateCamera(&camera, rl.CameraMode.ORBITAL)
  53. rl.BeginDrawing()
  54. rl.ClearBackground(rl.RAYWHITE)
  55. time := 2.0 * f32(rl.GetTime())
  56. r3d.SetScreenShaderUniform(shader, "u_time", &time)
  57. r3d.SetSurfaceShaderUniform(material.shader, "u_time", &time)
  58. r3d.Begin(camera)
  59. r3d.DrawMesh(plane, r3d.GetDefaultMaterial(), {0, -0.5, 0}, 1.0)
  60. r3d.DrawMesh(torus, material, {0, 0, 0}, 1.0)
  61. r3d.End()
  62. rl.EndDrawing()
  63. }
  64. }