Преглед изворни кода

Added new example - [shader] render depth texture

pull/4861/head
luis605 пре 6 дана
родитељ
комит
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;
}

Loading…
Откажи
Сачувај