Преглед на файлове

Added new example - [shader] render depth texture

luis605 преди 5 месеца
родител
ревизия
e08fc8ab80
променени са 3 файла, в които са добавени 183 реда и са изтрити 41 реда
  1. 14 21
      examples/shaders/resources/shaders/glsl100/depth.fs
  2. 12 20
      examples/shaders/resources/shaders/glsl330/depth.fs
  3. 157 0
      examples/shaders/shaders_view_depth.c

+ 14 - 21
examples/shaders/resources/shaders/glsl100/depth.fs

@@ -1,26 +1,19 @@
 #version 100
 
-precision mediump float;
+in vec2 fragTexCoord;
+out vec4 finalColor;
+uniform sampler2D depthTexture;
 
-// Input vertex attributes (from vertex shader)
-varying vec2 fragTexCoord;
-varying vec4 fragColor;
-
-// Input uniform values
-uniform sampler2D texture0;     // Depth texture
-uniform vec4 colDiffuse;
-
-// NOTE: Add your custom variables here
-
-void main()
+float linearizeDepth(float depth)
 {
-    float zNear = 0.01; // camera z near
-    float zFar = 10.0;  // camera z far
-    float z = texture2D(texture0, fragTexCoord).x;
-
-    // Linearize depth value
-    float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
+    float n = 0.1;    // near plane
+    float f = 100.0;  // far plane
+    return (2.0 * n) / (f + n - depth * (f - n));
+}
 
-    // Calculate final fragment color
-    gl_FragColor = vec4(depth, depth, depth, 1.0);
-}
+void main() {
+    vec2 flippedTexCoord = vec2(fragTexCoord.x, 1.0 - fragTexCoord.y);
+    float depth = texture(depthTexture, flippedTexCoord).r;
+    float linearDepth = linearizeDepth(depth);
+    finalColor = vec4(vec3(linearDepth), 1.0);
+}

+ 12 - 20
examples/shaders/resources/shaders/glsl330/depth.fs

@@ -1,27 +1,19 @@
 #version 330
 
-// Input vertex attributes (from vertex shader)
 in vec2 fragTexCoord;
-in vec4 fragColor;
-
-// Input uniform values
-uniform sampler2D texture0;     // Depth texture
-uniform vec4 colDiffuse;
-
-// Output fragment color
 out vec4 finalColor;
+uniform sampler2D depthTexture;
 
-// NOTE: Add your custom variables here
-
-void main()
+float linearizeDepth(float depth)
 {
-    float zNear = 0.01; // camera z near
-    float zFar = 10.0;  // camera z far
-    float z = texture(texture0, fragTexCoord).x;
-
-    // Linearize depth value
-    float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
+    float n = 0.1;    // near plane
+    float f = 100.0;  // far plane
+    return (2.0 * n) / (f + n - depth * (f - n));
+}
 
-    // Calculate final fragment color
-    finalColor = vec4(depth, depth, depth, 1.0);
-}
+void main() {
+    vec2 flippedTexCoord = vec2(fragTexCoord.x, 1.0 - fragTexCoord.y);
+    float depth = texture(depthTexture, flippedTexCoord).r;
+    float linearDepth = linearizeDepth(depth);
+    finalColor = vec4(vec3(linearDepth), 1.0);
+}

+ 157 - 0
examples/shaders/shaders_view_depth.c

@@ -0,0 +1,157 @@
+/*******************************************************************************************
+*
+*   raylib [shader] example - render depth texture
+*
+*   Example complexity rating: [★★★☆] 3/4
+*
+*   Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
+*
+*   Example contributed by Luís Almeida (@luis605)
+*
+*   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+*   BSD-like license that allows static linking with closed source software
+*
+*   Copyright (c) 2025 Luís Almeida (@luis605)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "rlgl.h"
+
+#if defined(PLATFORM_DESKTOP)
+    #define GLSL_VERSION            330
+#else   // PLATFORM_ANDROID, PLATFORM_WEB
+    #define GLSL_VERSION            100
+#endif
+
+RenderTexture2D LoadRenderTextureWithDepth(int width, int height);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 600;
+
+    InitWindow(screenWidth, screenHeight, "raylib [shader] example - render depth texture");
+
+    // Load camera
+    Camera camera = { 0 };
+    camera.position = (Vector3){ 4.0f, 1.0f, 5.0f };
+    camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
+    camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
+    camera.fovy = 45.0f;
+    camera.projection = CAMERA_PERSPECTIVE;
+
+    // Load an empty render texture with a depth texture
+    RenderTexture2D target = LoadRenderTextureWithDepth(screenWidth, screenHeight);
+
+    // Load depth shader and get depth texture shader location
+    Shader depthShader = LoadShader(0, TextFormat("resources/shaders/glsl%i/depth.fs", GLSL_VERSION));
+    int depthLoc = GetShaderLocation(depthShader, "depthTexture");
+
+    // Load models
+    Model cube  = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f));
+    Model floor = LoadModelFromMesh(GenMeshPlane(20.0f, 20.0f, 1, 1));
+
+    DisableCursor();  // Limit cursor to relative movement inside the window
+
+    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, CAMERA_FREE);
+        //----------------------------------------------------------------------------------
+
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginTextureMode(target);
+
+            ClearBackground(WHITE);
+
+            BeginMode3D(camera);
+
+                DrawModel(cube,  (Vector3){ 0.0f, 0.0f, 0.0f },  3.0f, YELLOW);
+                DrawModel(floor, (Vector3){ 10.0f, 0.0f, 2.0f }, 2.0f, RED);
+
+            EndMode3D();
+
+        EndTextureMode();
+
+        BeginDrawing();
+
+            BeginShaderMode(depthShader);
+
+                SetShaderValueTexture(depthShader, depthLoc, target.depth);
+                DrawTexture(target.depth, 0, 0, WHITE);
+
+            EndShaderMode();
+
+            DrawRectangle( 10, 10, 320, 93, Fade(SKYBLUE, 0.5f));
+            DrawRectangleLines( 10, 10, 320, 93, BLUE);
+
+            DrawText("Camera Controls:", 20, 20, 10, BLACK);
+            DrawText("- WASD to move", 40, 40, 10, DARKGRAY);
+            DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, DARKGRAY);
+            DrawText("- Z to zoom to (0, 0, 0)", 40, 80, 10, DARKGRAY);
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    UnloadModel(cube);              // Unload model
+    UnloadModel(floor);             // Unload model
+    UnloadRenderTexture(target);    // Unload render texture
+    UnloadShader(depthShader);      // Unload shader
+
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+    return 0;
+}
+
+RenderTexture2D LoadRenderTextureWithDepth(int width, int height)
+{
+    RenderTexture2D target = {0};
+
+    target.id = rlLoadFramebuffer();   // Load an empty framebuffer
+
+    if (target.id > 0)
+    {
+        rlEnableFramebuffer(target.id);
+
+        // Create color texture (default to RGBA)
+        target.texture.id = rlLoadTexture(0, width, height, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
+        target.texture.width = width;
+        target.texture.height = height;
+        target.texture.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
+        target.texture.mipmaps = 1;
+
+        // Create depth texture
+        target.depth.id = rlLoadTextureDepth(width, height, false);
+        target.depth.width = width;
+        target.depth.height = height;
+        target.depth.format = 19;       //DEPTH_COMPONENT_24BIT? THIS DOESN'T EXIST IN RAYLIB
+        target.depth.mipmaps = 1;
+
+        // Attach color texture and depth texture to FBO
+        rlFramebufferAttach(target.id, target.texture.id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0);
+        rlFramebufferAttach(target.id, target.depth.id, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_TEXTURE2D, 0);
+
+        // Check if fbo is complete with attachments (valid)
+        if (rlFramebufferComplete(target.id)) TRACELOG(LOG_INFO, "FBO: [ID %i] Framebuffer object created successfully", target.id);
+
+        rlDisableFramebuffer();
+    }
+    else TRACELOG(LOG_WARNING, "FBO: Framebuffer object can not be created");
+
+    return target;
+}