diff --git a/examples/models/models_skybox.py b/examples/models/models_skybox.py new file mode 100644 index 0000000..f72a895 --- /dev/null +++ b/examples/models/models_skybox.py @@ -0,0 +1,67 @@ +from raylib.dynamic import raylib as rl, ffi +from raylib.colors import * + +screenWidth = 1260 +screenHeight = 768 + +rl.InitWindow(screenWidth, screenHeight, b'Skymap Demo') + +camera = ffi.new('struct Camera3D *', [[1, 1, 1], [4, 1, 4], [0, 1, 0], 70, 0]) + +cube = rl.GenMeshCube(100, 100, 100) +skybox = rl.LoadModelFromMesh(cube) + +skybox.materials[0].shader = rl.LoadShader( + b'res/shader/skybox.vs.glsl', + b'res/shader/skybox.fs.glsl' +) + +rl.SetShaderValue( + skybox.materials[0].shader, + rl.GetShaderLocation(skybox.materials[0].shader, b"environmentMap"), + ffi.new('int[]', [rl.MAP_CUBEMAP]), + rl.UNIFORM_INT +) + +shdrCubemap = rl.LoadShader( + b'res/shader/cubemap.vs.glsl', + b'res/shader/cubemap.fs.glsl' +) + +rl.SetShaderValue( + shdrCubemap, + rl.GetShaderLocation(shdrCubemap, b'equirectangularMap'), + ffi.new('int[]', [0]), + rl.UNIFORM_INT +) + +texHDR = rl.LoadTexture(b'res/img/skymap.hdr') + +skybox.materials[0].maps[rl.MAP_CUBEMAP].texture = rl.GenTextureCubemap(shdrCubemap, texHDR, 512); + +rl.UnloadTexture(texHDR) +rl.UnloadShader(shdrCubemap) + +rl.SetCameraMode(camera[0], rl.CAMERA_FIRST_PERSON) + +rl.SetTargetFPS(60) + +while not rl.WindowShouldClose(): + rl.UpdateCamera(camera) + rl.BeginDrawing() + rl.ClearBackground(RAYWHITE) + rl.BeginMode3D(camera[0]) + rl.DrawModel(skybox, [0, 0, 0], 1.0, WHITE) + rl.DrawGrid(10, 1.0) + for x in range(10): + for y in range(10): + rl.DrawCube([x * 2, 0, y * 2], 1, 1, 1, MAROON) + rl.DrawCubeWires([x * 2, 0, y * 2], 1, 1, 1, RED) + rl.EndMode3D() + rl.DrawFPS(10, 10) + rl.EndDrawing() + +rl.CloseWindow() +rl.UnloadShader(skybox.materials[0].shader) +rl.UnloadTexture(skybox.materials[0].maps[rl.MAP_CUBEMAP].texture) +rl.UnloadModel(skybox) diff --git a/examples/res/img/skymap.hdr b/examples/res/img/skymap.hdr new file mode 100644 index 0000000..b6d0e77 Binary files /dev/null and b/examples/res/img/skymap.hdr differ diff --git a/examples/res/shader/cubemap.fs.glsl b/examples/res/shader/cubemap.fs.glsl new file mode 100644 index 0000000..e8e2853 --- /dev/null +++ b/examples/res/shader/cubemap.fs.glsl @@ -0,0 +1,38 @@ +/******************************************************************************************* +* +* rPBR [shader] - Equirectangular to cubemap fragment shader +* +* Copyright (c) 2017 Victor Fisac +* +**********************************************************************************************/ + +#version 330 + +// Input vertex attributes (from vertex shader) +in vec3 fragPosition; + +// Input uniform values +uniform sampler2D equirectangularMap; + +// Output fragment color +out vec4 finalColor; + +vec2 SampleSphericalMap(vec3 v) +{ + vec2 uv = vec2(atan(v.z, v.x), asin(v.y)); + uv *= vec2(0.1591, 0.3183); + uv += 0.5; + return uv; +} + +void main() +{ + // Normalize local position + vec2 uv = SampleSphericalMap(normalize(fragPosition)); + + // Fetch color from texture map + vec3 color = texture(equirectangularMap, uv).rgb; + + // Calculate final fragment color + finalColor = vec4(color, 1.0); +} diff --git a/examples/res/shader/cubemap.vs.glsl b/examples/res/shader/cubemap.vs.glsl new file mode 100644 index 0000000..5721eaa --- /dev/null +++ b/examples/res/shader/cubemap.vs.glsl @@ -0,0 +1,28 @@ +/******************************************************************************************* +* +* rPBR [shader] - Equirectangular to cubemap vertex shader +* +* Copyright (c) 2017 Victor Fisac +* +**********************************************************************************************/ + +#version 330 + +// Input vertex attributes +in vec3 vertexPosition; + +// Input uniform values +uniform mat4 projection; +uniform mat4 view; + +// Output vertex attributes (to fragment shader) +out vec3 fragPosition; + +void main() +{ + // Calculate fragment position based on model transformations + fragPosition = vertexPosition; + + // Calculate final vertex position + gl_Position = projection*view*vec4(vertexPosition, 1.0); +} diff --git a/examples/res/shader/skybox.fs.glsl b/examples/res/shader/skybox.fs.glsl new file mode 100644 index 0000000..053a251 --- /dev/null +++ b/examples/res/shader/skybox.fs.glsl @@ -0,0 +1,31 @@ +/******************************************************************************************* +* +* rPBR [shader] - Background skybox fragment shader +* +* Copyright (c) 2017 Victor Fisac +* +**********************************************************************************************/ + +#version 330 + +// Input vertex attributes (from vertex shader) +in vec3 fragPosition; + +// Input uniform values +uniform samplerCube environmentMap; + +// Output fragment color +out vec4 finalColor; + +void main() +{ + // Fetch color from texture map + vec3 color = texture(environmentMap, fragPosition).rgb; + + // Apply gamma correction + color = color/(color + vec3(1.0)); + color = pow(color, vec3(1.0/2.2)); + + // Calculate final fragment color + finalColor = vec4(color, 1.0); +} diff --git a/examples/res/shader/skybox.vs.glsl b/examples/res/shader/skybox.vs.glsl new file mode 100644 index 0000000..4fe9a2c --- /dev/null +++ b/examples/res/shader/skybox.vs.glsl @@ -0,0 +1,32 @@ +/******************************************************************************************* +* +* rPBR [shader] - Background skybox vertex shader +* +* Copyright (c) 2017 Victor Fisac +* +**********************************************************************************************/ + +#version 330 + +// Input vertex attributes +in vec3 vertexPosition; + +// Input uniform values +uniform mat4 projection; +uniform mat4 view; + +// Output vertex attributes (to fragment shader) +out vec3 fragPosition; + +void main() +{ + // Calculate fragment position based on model transformations + fragPosition = vertexPosition; + + // Remove translation from the view matrix + mat4 rotView = mat4(mat3(view)); + vec4 clipPos = projection*rotView*vec4(vertexPosition, 1.0); + + // Calculate final vertex position + gl_Position = clipPos.xyzw; +}