|
|
@ -21,12 +21,18 @@ |
|
|
|
#define RLIGHTS_IMPLEMENTATION |
|
|
|
#include "rlights.h" |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#define GLSL_VERSION 330 |
|
|
|
#else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB |
|
|
|
#define GLSL_VERSION 100 |
|
|
|
#endif |
|
|
|
|
|
|
|
#define CUBEMAP_SIZE 1024 // Cubemap texture size |
|
|
|
#define IRRADIANCE_SIZE 32 // Irradiance texture size |
|
|
|
#define PREFILTERED_SIZE 256 // Prefiltered HDR environment texture size |
|
|
|
#define BRDF_SIZE 512 // BRDF LUT texture size |
|
|
|
#define LIGHT_DISTANCE 1000.0f |
|
|
|
#define LIGHT_HEIGHT 1.0f |
|
|
|
#define LIGHT_DISTANCE 1000.0f |
|
|
|
#define LIGHT_HEIGHT 1.0f |
|
|
|
|
|
|
|
// PBR texture maps generation |
|
|
|
static TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int size, int format); // Generate cubemap (6 faces) from equirectangular (panorama) texture |
|
|
@ -127,11 +133,8 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness) |
|
|
|
Material mat = LoadMaterialDefault(); // Initialize material to default |
|
|
|
|
|
|
|
// Load PBR shader (requires several maps) |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
mat.shader = LoadShader("resources/shaders/glsl330/pbr.vs", "resources/shaders/glsl330/pbr.fs"); |
|
|
|
#else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB |
|
|
|
mat.shader = LoadShader("resources/shaders/glsl100/pbr.vs", "resources/shaders/glsl100/pbr.fs"); |
|
|
|
#endif |
|
|
|
mat.shader = LoadShader(TextFormat("resources/shaders/glsl%i/pbr.vs", GLSL_VERSION), |
|
|
|
TextFormat("resources/shaders/glsl%i/pbr.fs", GLSL_VERSION)); |
|
|
|
|
|
|
|
// Get required locations points for PBR material |
|
|
|
// NOTE: Those location names must be available and used in the shader code |
|
|
@ -187,12 +190,11 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness) |
|
|
|
// Generate cubemap from panorama texture |
|
|
|
//-------------------------------------------------------------------------------------------------------- |
|
|
|
Texture2D panorama = LoadTexture("resources/dresden_square_2k.hdr"); |
|
|
|
|
|
|
|
// Load equirectangular to cubemap shader |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
Shader shdrCubemap = LoadShader("resources/shaders/glsl330/cubemap.vs", "resources/shaders/glsl330/cubemap.fs"); |
|
|
|
#else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB |
|
|
|
Shader shdrCubemap = LoadShader("resources/shaders/glsl100/cubemap.vs", "resources/shaders/glsl100/cubemap.fs"); |
|
|
|
#endif |
|
|
|
Shader shdrCubemap = LoadShader(TextFormat("resources/shaders/glsl%i/pbr.vs", GLSL_VERSION), |
|
|
|
TextFormat("resources/shaders/glsl%i/pbr.fs", GLSL_VERSION)); |
|
|
|
|
|
|
|
SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, SHADER_UNIFORM_INT); |
|
|
|
TextureCubemap cubemap = GenTextureCubemap(shdrCubemap, panorama, CUBEMAP_SIZE, PIXELFORMAT_UNCOMPRESSED_R32G32B32); |
|
|
|
UnloadTexture(panorama); |
|
|
@ -202,11 +204,9 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness) |
|
|
|
// Generate irradiance map from cubemap texture |
|
|
|
//-------------------------------------------------------------------------------------------------------- |
|
|
|
// Load irradiance (GI) calculation shader |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
Shader shdrIrradiance = LoadShader("resources/shaders/glsl330/skybox.vs", "resources/shaders/glsl330/irradiance.fs"); |
|
|
|
#else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB |
|
|
|
Shader shdrIrradiance = LoadShader("resources/shaders/glsl100/skybox.vs", "resources/shaders/glsl100/irradiance.fs"); |
|
|
|
#endif |
|
|
|
Shader shdrIrradiance = LoadShader(TextFormat("resources/shaders/glsl%i/skybox.vs", GLSL_VERSION), |
|
|
|
TextFormat("resources/shaders/glsl%i/irradiance.fs", GLSL_VERSION)); |
|
|
|
|
|
|
|
SetShaderValue(shdrIrradiance, GetShaderLocation(shdrIrradiance, "environmentMap"), (int[1]){ 0 }, SHADER_UNIFORM_INT); |
|
|
|
mat.maps[MATERIAL_MAP_IRRADIANCE].texture = GenTextureIrradiance(shdrIrradiance, cubemap, IRRADIANCE_SIZE); |
|
|
|
UnloadShader(shdrIrradiance); |
|
|
@ -215,11 +215,9 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness) |
|
|
|
// Generate prefilter map from cubemap texture |
|
|
|
//-------------------------------------------------------------------------------------------------------- |
|
|
|
// Load reflection prefilter calculation shader |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
Shader shdrPrefilter = LoadShader("resources/shaders/glsl330/skybox.vs", "resources/shaders/glsl330/prefilter.fs"); |
|
|
|
#else |
|
|
|
Shader shdrPrefilter = LoadShader("resources/shaders/glsl100/skybox.vs", "resources/shaders/glsl100/prefilter.fs"); |
|
|
|
#endif |
|
|
|
Shader shdrPrefilter = LoadShader(TextFormat("resources/shaders/glsl%i/skybox.vs", GLSL_VERSION), |
|
|
|
TextFormat("resources/shaders/glsl%i/prefilter.fs", GLSL_VERSION)); |
|
|
|
|
|
|
|
SetShaderValue(shdrPrefilter, GetShaderLocation(shdrPrefilter, "environmentMap"), (int[1]){ 0 }, SHADER_UNIFORM_INT); |
|
|
|
mat.maps[MATERIAL_MAP_PREFILTER].texture = GenTexturePrefilter(shdrPrefilter, cubemap, PREFILTERED_SIZE); |
|
|
|
UnloadTexture(cubemap); |
|
|
@ -228,11 +226,9 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness) |
|
|
|
|
|
|
|
// Generate BRDF (bidirectional reflectance distribution function) texture (using shader) |
|
|
|
//-------------------------------------------------------------------------------------------------------- |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
Shader shdrBRDF = LoadShader("resources/shaders/glsl330/brdf.vs", "resources/shaders/glsl330/brdf.fs"); |
|
|
|
#else |
|
|
|
Shader shdrBRDF = LoadShader("resources/shaders/glsl100/brdf.vs", "resources/shaders/glsl100/brdf.fs"); |
|
|
|
#endif |
|
|
|
Shader shdrBRDF = LoadShader(TextFormat("resources/shaders/glsl%i/brdf.vs", GLSL_VERSION), |
|
|
|
TextFormat("resources/shaders/glsl%i/brdf.fs", GLSL_VERSION)); |
|
|
|
|
|
|
|
mat.maps[MATERIAL_MAP_BRDG].texture = GenTextureBRDF(shdrBRDF, BRDF_SIZE); |
|
|
|
UnloadShader(shdrBRDF); |
|
|
|
//-------------------------------------------------------------------------------------------------------- |
|
|
@ -293,7 +289,7 @@ static TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int s |
|
|
|
|
|
|
|
rlClearScreenBuffers(); |
|
|
|
DrawCubeV(Vector3Zero(), Vector3One(), WHITE); |
|
|
|
rlDrawRenderBatch(RLGL.currentBatch); |
|
|
|
rlDrawRenderBatchActive(); |
|
|
|
} |
|
|
|
//------------------------------------------------------------------------------------------ |
|
|
|
|
|
|
|