Bläddra i källkod

REVIEWED: `shaders_write_depth` example

Ray 2 år sedan
förälder
incheckning
5ba41e4f7f

+ 3 - 1
examples/shaders/resources/shaders/glsl100/write_depth.fs

@@ -7,9 +7,11 @@ varying vec4 fragColor;
 
 uniform sampler2D texture0;
 uniform vec4 colDiffuse;
+
 void main()
 {
     vec4 texelColor = texture2D(texture0, fragTexCoord);
+    
     gl_FragColor = texelColor*colDiffuse*fragColor;
-	gl_FragDepthEXT = 1.0 - gl_FragCoord.z;
+    gl_FragDepthEXT = 1.0 - gl_FragCoord.z;
 }

+ 4 - 2
examples/shaders/resources/shaders/glsl330/write_depth.fs

@@ -5,9 +5,11 @@ in vec4 fragColor;
 
 uniform sampler2D texture0;
 uniform vec4 colDiffuse;
+
 void main()
 {
     vec4 texelColor = texture2D(texture0, fragTexCoord);
+    
     gl_FragColor = texelColor*colDiffuse*fragColor;
-	gl_FragDepth = 1.0 - gl_FragCoord.z;
-}
+    gl_FragDepth = 1.0 - gl_FragCoord.z;
+}

+ 96 - 77
examples/shaders/shaders_write_depth.c

@@ -1,6 +1,6 @@
 /*******************************************************************************************
 *
-*   raylib [core] example - Basic window
+*   raylib [shaders] example - Depth buffer writing
 *
 *   Example originally created with raylib 4.2, last time updated with raylib 4.2
 *
@@ -9,7 +9,7 @@
 *   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) 2022 Buğra Alptekin Sarı (@BugraAlptekinSari)
+*   Copyright (c) 2022-2023 Buğra Alptekin Sarı (@BugraAlptekinSari)
 *
 ********************************************************************************************/
 
@@ -21,60 +21,16 @@
 #else   // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
 #define GLSL_VERSION            100
 #endif
-//------------------------------------------------------------------------------------
-// Customized render texture function to create a writable render buffer
-RenderTexture2D LoadRenderTextureMOD(int width, int height)
-{
-    RenderTexture2D target = { 0 };
-
-    target.id = rlLoadFramebuffer(width, height);   // 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 rendertexture
-        target.depth.id = rlLoadTextureDepth(width, height, false);
-        target.depth.width = width;
-        target.depth.height = height;
-        target.depth.format = 19;       //DEPTH_COMPONENT_24BIT?
-        target.depth.mipmaps = 1;
-
-        // Attach color texture and depth renderbuffer/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;
-}
 
+//------------------------------------------------------------------------------------
+// Declare custom functions required for the example
+//------------------------------------------------------------------------------------
+// Load custom render texture, create a writable depth texture buffer
+static RenderTexture2D LoadRenderTextureDepthTex(int width, int height);
 // Unload render texture from GPU memory (VRAM)
-void UnloadRenderTextureMOD(RenderTexture2D target)
-{
-    if (target.id > 0)
-    {
-        // Color texture attached to FBO is deleted
-        rlUnloadTexture(target.texture.id);
-        rlUnloadTexture(target.depth.id);
+static void UnloadRenderTextureDepthTex(RenderTexture2D target);
+
 
-        // NOTE: Depth texture/renderbuffer is automatically
-        // queried and deleted before deleting framebuffer
-        rlUnloadFramebuffer(target.id);
-    }
-}
 //------------------------------------------------------------------------------------
 // Program main entry point
 //------------------------------------------------------------------------------------
@@ -85,22 +41,25 @@ int main(void)
     const int screenWidth = 800;
     const int screenHeight = 450;
 
-    InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
+    InitWindow(screenWidth, screenHeight, "raylib [shaders] example - write depth buffer");
 
-    // The shader inverst the depth buffer by writing into it by `gl_FragDepth = 1 - gl_FragCoord.z;`
+    // The shader inverts the depth buffer by writing into it by `gl_FragDepth = 1 - gl_FragCoord.z;`
     Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/write_depth.fs", GLSL_VERSION));
 
-    //Use Customized function to create writable depth buffer
-    RenderTexture2D target = LoadRenderTextureMOD(screenWidth, screenHeight);
+    // Use Customized function to create writable depth texture buffer
+    RenderTexture2D target = LoadRenderTextureDepthTex(screenWidth, screenHeight);
 
-    Camera camera = {    // Define the camera to look into our 3d world
+    // Define the camera to look into our 3d world
+    Camera camera = {
         .position = (Vector3){ 2.0f, 2.0f, 3.0f },    // Camera position
         .target = (Vector3){ 0.0f, 0.5f, 0.0f },      // Camera looking at point
         .up = (Vector3){ 0.0f, 1.0f, 0.0f },          // Camera up vector (rotation towards target)
         .fovy = 45.0f,                                // Camera field-of-view Y
-        .projection = CAMERA_PERSPECTIVE             // Camera mode type
+        .projection = CAMERA_PERSPECTIVE              // Camera mode type
     };
+    
     SetCameraMode(camera, CAMERA_ORBITAL);
+    
     SetTargetFPS(60);
     //--------------------------------------------------------------------------------------
 
@@ -110,36 +69,39 @@ int main(void)
         // Update
         //----------------------------------------------------------------------------------
         UpdateCamera(&camera);
+        //----------------------------------------------------------------------------------
+        
         // Draw
         //----------------------------------------------------------------------------------
-        // Draw FBO
+        
+        // Draw into our custom render texture (framebuffer)
         BeginTextureMode(target);
-        ClearBackground(WHITE);
-        BeginMode3D(camera);
-        BeginShaderMode(shader);
-        DrawCubeWiresV((Vector3) { 0.0f, 0.5f, 1.0f }, (Vector3) { 1.0f, 1.0f, 1.0f }, RED);
-        DrawCubeV((Vector3) { 0.0f, 0.5f, 1.0f }, (Vector3) { 1.0f, 1.0f, 1.0f }, PURPLE);
-        DrawCubeWiresV((Vector3) { 0.0f, 0.5f, -1.0f }, (Vector3) { 1.0f, 1.0f, 1.0f }, DARKGREEN);
-        DrawCubeV((Vector3) { 0.0f, 0.5f, -1.0f }, (Vector3) { 1.0f, 1.0f, 1.0f }, YELLOW);
-        DrawGrid(10, 1.0f);
-        EndShaderMode();
-        EndMode3D();
+            ClearBackground(WHITE);
+            
+            BeginMode3D(camera);
+                BeginShaderMode(shader);
+                    DrawCubeWiresV((Vector3){ 0.0f, 0.5f, 1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, RED);
+                    DrawCubeV((Vector3){ 0.0f, 0.5f, 1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, PURPLE);
+                    DrawCubeWiresV((Vector3){ 0.0f, 0.5f, -1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, DARKGREEN);
+                    DrawCubeV((Vector3) { 0.0f, 0.5f, -1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, YELLOW);
+                    DrawGrid(10, 1.0f);
+                EndShaderMode();
+            EndMode3D();
         EndTextureMode();
 
-        // Draw Screen
+        // Draw into screen our custom render texture 
         BeginDrawing();
-
-        ClearBackground(RAYWHITE);
-        DrawTextureRec(target.texture, (Rectangle) { 0, 0, screenWidth, -screenHeight }, (Vector2) { 0, 0 }, WHITE);
-        DrawFPS(0, 0);
-
+            ClearBackground(RAYWHITE);
+        
+            DrawTextureRec(target.texture, (Rectangle) { 0, 0, screenWidth, -screenHeight }, (Vector2) { 0, 0 }, WHITE);
+            DrawFPS(10, 10);
         EndDrawing();
         //----------------------------------------------------------------------------------
     }
 
     // De-Initialization
     //--------------------------------------------------------------------------------------
-    UnloadRenderTextureMOD(target);
+    UnloadRenderTextureDepthTex(target);
     UnloadShader(shader);
 
     CloseWindow();        // Close window and OpenGL context
@@ -147,3 +109,60 @@ int main(void)
 
     return 0;
 }
+
+//------------------------------------------------------------------------------------
+// Define custom functions required for the example
+//------------------------------------------------------------------------------------
+// Load custom render texture, create a writable depth texture buffer
+RenderTexture2D LoadRenderTextureDepthTex(int width, int height)
+{
+    RenderTexture2D target = { 0 };
+
+    target.id = rlLoadFramebuffer(width, height);   // 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 buffer (instead of raylib default renderbuffer)
+        target.depth.id = rlLoadTextureDepth(width, height, false);
+        target.depth.width = width;
+        target.depth.height = height;
+        target.depth.format = 19;       //DEPTH_COMPONENT_24BIT?
+        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;
+}
+
+// Unload render texture from GPU memory (VRAM)
+void UnloadRenderTextureDepthTex(RenderTexture2D target)
+{
+    if (target.id > 0)
+    {
+        // Color texture attached to FBO is deleted
+        rlUnloadTexture(target.texture.id);
+        rlUnloadTexture(target.depth.id);
+
+        // NOTE: Depth texture is automatically
+        // queried and deleted before deleting framebuffer
+        rlUnloadFramebuffer(target.id);
+    }
+}