123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*******************************************************************************************
- *
- * raylib [models] example - Skybox loading and drawing
- *
- * This example has been created using raylib 3.5 (www.raylib.com)
- * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
- *
- * Copyright (c) 2017-2020 Ramon Santamaria (@raysan5)
- *
- ********************************************************************************************/
- #include "raylib.h"
- #include "rlgl.h"
- bool useHDR = false;
- int main(void)
- {
- // Initialization
- //--------------------------------------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
- InitWindow(screenWidth, screenHeight, "raylib [models] example - skybox loading and drawing");
- // Define the camera to look into our 3d world
- Camera camera = { { 1.0f, 1.0f, 1.0f }, { 4.0f, 1.0f, 4.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 };
- // Load skybox model
- Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
- Model skybox = LoadModelFromMesh(cube);
- // Load skybox shader and set required locations
- // NOTE: Some locations are automatically set at shader loading
- #if defined(PLATFORM_DESKTOP)
- skybox.materials[0].shader = LoadShader("resources/shaders/glsl330/skybox.vs", "resources/shaders/glsl330/skybox.fs");
- #else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
- skybox.materials[0].shader = LoadShader("resources/shaders/glsl100/skybox.vs", "resources/shaders/glsl100/skybox.fs");
- #endif
- SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "environmentMap"), (int[1]){ MATERIAL_MAP_CUBEMAP }, SHADER_UNIFORM_INT);
- SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "doGamma"), (int[1]) { useHDR ? 1 : 0 }, SHADER_UNIFORM_INT);
- SetShaderValue(skybox.materials[0].shader, GetShaderLocation(skybox.materials[0].shader, "vflipped"), (int[1]){ useHDR ? 1 : 0 }, SHADER_UNIFORM_INT);
- // Load cubemap shader and setup required shader locations
- #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
- SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, SHADER_UNIFORM_INT);
- char skyboxFileName[256] = { 0 };
- if (useHDR)
- {
- TextCopy(skyboxFileName, "resources/dresden_square_2k.hdr");
- // Load HDR panorama (sphere) texture
- Texture2D panorama = panorama = LoadTexture(skyboxFileName);
- // Generate cubemap (texture with 6 quads-cube-mapping) from panorama HDR texture
- // NOTE 1: New texture is generated rendering to texture, shader calculates the sphere->cube coordinates mapping
- // NOTE 2: It seems on some Android devices WebGL, fbo does not properly support a FLOAT-based attachment,
- // despite texture can be successfully created.. so using PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 instead of PIXELFORMAT_UNCOMPRESSED_R32G32B32A32
- skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = rlGenTextureCubemap(shdrCubemap, panorama, 1024, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8);
- UnloadTexture(panorama); // Texture not required anymore, cubemap already generated
- }
- else
- {
- Image img = LoadImage("resources/skybox.png");
- skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT); // CUBEMAP_LAYOUT_PANORAMA
- UnloadImage(img);
- }
- SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set a first person camera mode
- SetTargetFPS(60); // Set our game to run at 60 frames-per-second
- //--------------------------------------------------------------------------------------
- // Main game loop
- while (!WindowShouldClose()) // Detect window close button or ESC key
- {
- // Update
- //----------------------------------------------------------------------------------
- UpdateCamera(&camera); // Update camera
-
- // Load new cubemap texture on drag&drop
- if (IsFileDropped())
- {
- int count = 0;
- char **droppedFiles = GetDroppedFiles(&count);
- if (count == 1) // Only support one file dropped
- {
- if (IsFileExtension(droppedFiles[0], ".png;.jpg;.hdr;.bmp;.tga"))
- {
- // Unload current cubemap texture and load new one
- UnloadTexture(skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture);
- if (useHDR)
- {
- Texture2D panorama = LoadTexture(droppedFiles[0]);
-
- // Generate cubemap from panorama texture
- skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = rlGenTextureCubemap(shdrCubemap, panorama, 1024, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8);
- UnloadTexture(panorama);
- }
- else
- {
- Image img = LoadImage(droppedFiles[0]);
- skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT);
- UnloadImage(img);
- }
- TextCopy(skyboxFileName, droppedFiles[0]);
- }
- }
- ClearDroppedFiles(); // Clear internal buffers
- }
- //----------------------------------------------------------------------------------
- // Draw
- //----------------------------------------------------------------------------------
- BeginDrawing();
- ClearBackground(RAYWHITE);
- BeginMode3D(camera);
-
- // We are inside the cube, we need to disable backface culling!
- rlDisableBackfaceCulling();
- rlDisableDepthMask();
- DrawModel(skybox, (Vector3){0, 0, 0}, 1.0f, WHITE);
- rlEnableBackfaceCulling();
- rlEnableDepthMask();
-
- DrawGrid(10, 1.0f);
-
- EndMode3D();
- if (useHDR)
- DrawText(TextFormat("Panorama image from hdrihaven.com: %s", GetFileName(skyboxFileName)), 10, GetScreenHeight() - 20, 10, BLACK);
- else
- DrawText(TextFormat(": %s", GetFileName(skyboxFileName)), 10, GetScreenHeight() - 20, 10, BLACK);
- DrawFPS(10, 10);
- EndDrawing();
- //----------------------------------------------------------------------------------
- }
- // De-Initialization
- //--------------------------------------------------------------------------------------
- UnloadShader(skybox.materials[0].shader);
- UnloadTexture(skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture);
-
- UnloadModel(skybox); // Unload skybox model
- CloseWindow(); // Close window and OpenGL context
- //--------------------------------------------------------------------------------------
- return 0;
- }
|