added skybox example
This commit is contained in:
parent
779fd39135
commit
4ce5b08c99
6 changed files with 196 additions and 0 deletions
67
examples/models/models_skybox.py
Normal file
67
examples/models/models_skybox.py
Normal file
|
@ -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)
|
BIN
examples/res/img/skymap.hdr
Normal file
BIN
examples/res/img/skymap.hdr
Normal file
Binary file not shown.
38
examples/res/shader/cubemap.fs.glsl
Normal file
38
examples/res/shader/cubemap.fs.glsl
Normal file
|
@ -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);
|
||||
}
|
28
examples/res/shader/cubemap.vs.glsl
Normal file
28
examples/res/shader/cubemap.vs.glsl
Normal file
|
@ -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);
|
||||
}
|
31
examples/res/shader/skybox.fs.glsl
Normal file
31
examples/res/shader/skybox.fs.glsl
Normal file
|
@ -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);
|
||||
}
|
32
examples/res/shader/skybox.vs.glsl
Normal file
32
examples/res/shader/skybox.vs.glsl
Normal file
|
@ -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;
|
||||
}
|
Reference in a new issue