2
0
mirror of https://github.com/raylib-cs/raylib-cs synced 2025-09-09 03:01:41 -04:00

Fixed format

This commit is contained in:
MrScautHD
2024-02-09 19:16:40 +01:00
parent 1fac1c5d50
commit 6f8ea47c27

View File

@@ -1,33 +1,33 @@
/******************************************************************************************* /*******************************************************************************************
* *
* raylib [shaders] example - Basic PBR * raylib [shaders] example - Basic PBR
* *
* Example originally created with raylib 5.0, last time updated with raylib 5.1-dev * Example originally created with raylib 5.0, last time updated with raylib 5.1-dev
* *
* Example contributed by Afan OLOVCIC (@_DevDad) and reviewed by Ramon Santamaria (@raysan5) * Example contributed by Afan OLOVCIC (@_DevDad) and reviewed by Ramon Santamaria (@raysan5)
* *
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, * Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software * BSD-like license that allows static linking with closed source software
* *
* Copyright (c) 2023-2024 Afan OLOVCIC (@_DevDad) * Copyright (c) 2023-2024 Afan OLOVCIC (@_DevDad)
* *
* Model: "Old Rusty Car" (https://skfb.ly/LxRy) by Renafox, * Model: "Old Rusty Car" (https://skfb.ly/LxRy) by Renafox,
* licensed under Creative Commons Attribution-NonCommercial * licensed under Creative Commons Attribution-NonCommercial
* (http://creativecommons.org/licenses/by-nc/4.0/) * (http://creativecommons.org/licenses/by-nc/4.0/)
* *
********************************************************************************************/ ********************************************************************************************/
using System.Numerics; using System.Numerics;
using static Raylib_cs.Raylib;
using Examples.Shared; using Examples.Shared;
using static Raylib_cs.Raylib;
namespace Examples.Shaders; namespace Examples.Shaders;
public class BasicPbr public class BasicPbr
{ {
const int GLSL_VERSION = 330; private const int GLSL_VERSION = 330;
public unsafe static int Main() public static unsafe int Main()
{ {
// Initialization // Initialization
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
@@ -47,67 +47,64 @@ public class BasicPbr
camera.Projection = CameraProjection.Perspective; camera.Projection = CameraProjection.Perspective;
// Load PBR shader and setup all required locations // Load PBR shader and setup all required locations
Shader shader = LoadShader( var shader = LoadShader("resources/shaders/glsl330/pbr.vs", "resources/shaders/glsl330/pbr.fs");
"resources/shaders/glsl330/pbr.vs",
"resources/shaders/glsl330/pbr.fs"
);
shader.Locs[(int) ShaderLocationIndex.MapAlbedo] = GetShaderLocation(shader, "albedoMap"); shader.Locs[(int)ShaderLocationIndex.MapAlbedo] = GetShaderLocation(shader, "albedoMap");
// WARNING: Metalness, roughness, and ambient occlusion are all packed into a MRA texture // WARNING: Metalness, roughness, and ambient occlusion are all packed into a MRA texture
// They are passed as to the SHADER_LOC_MAP_METALNESS location for convenience, // They are passed as to the SHADER_LOC_MAP_METALNESS location for convenience,
// shader already takes care of it accordingly // shader already takes care of it accordingly
shader.Locs[(int) ShaderLocationIndex.MapMetalness] = GetShaderLocation(shader, "mraMap"); shader.Locs[(int)ShaderLocationIndex.MapMetalness] = GetShaderLocation(shader, "mraMap");
shader.Locs[(int) ShaderLocationIndex.MapNormal] = GetShaderLocation(shader, "normalMap"); shader.Locs[(int)ShaderLocationIndex.MapNormal] = GetShaderLocation(shader, "normalMap");
// WARNING: Similar to the MRA map, the emissive map packs different information // WARNING: Similar to the MRA map, the emissive map packs different information
// into a single texture: it stores height and emission data // into a single texture: it stores height and emission data
// It is binded to SHADER_LOC_MAP_EMISSION location an properly processed on shader // It is binded to SHADER_LOC_MAP_EMISSION location an properly processed on shader
shader.Locs[(int) ShaderLocationIndex.MapEmission] = GetShaderLocation(shader, "emissiveMap"); shader.Locs[(int)ShaderLocationIndex.MapEmission] = GetShaderLocation(shader, "emissiveMap");
shader.Locs[(int) ShaderLocationIndex.ColorDiffuse] = GetShaderLocation(shader, "albedoColor"); shader.Locs[(int)ShaderLocationIndex.ColorDiffuse] = GetShaderLocation(shader, "albedoColor");
// Setup additional required shader locations, including lights data // Setup additional required shader locations, including lights data
shader.Locs[(int) ShaderLocationIndex.VectorView] = GetShaderLocation(shader, "viewPos"); shader.Locs[(int)ShaderLocationIndex.VectorView] = GetShaderLocation(shader, "viewPos");
int lightCountLoc = GetShaderLocation(shader, "numOfLights"); var lightCountLoc = GetShaderLocation(shader, "numOfLights");
int maxLightCount = 4; var maxLightCount = 4;
SetShaderValue(shader, lightCountLoc, &maxLightCount, ShaderUniformDataType.Int); SetShaderValue(shader, lightCountLoc, &maxLightCount, ShaderUniformDataType.Int);
// Setup ambient color and intensity parameters // Setup ambient color and intensity parameters
float ambientIntensity = 0.02f; var ambientIntensity = 0.02f;
Color ambientColor = new Color(26, 32, 135, 255); var ambientColor = new Color(26, 32, 135, 255);
Vector3 ambientColorNormalized = new Vector3(ambientColor.R / 255.0F, ambientColor.G / 255.0F, ambientColor.B / 255.0F); var ambientColorNormalized = new Vector3(ambientColor.R / 255.0F, ambientColor.G / 255.0F, ambientColor.B / 255.0F);
SetShaderValue(shader, GetShaderLocation(shader, "ambientColor"), &ambientColorNormalized, ShaderUniformDataType.Vec3); SetShaderValue(shader, GetShaderLocation(shader, "ambientColor"), &ambientColorNormalized, ShaderUniformDataType.Vec3);
SetShaderValue(shader, GetShaderLocation(shader, "ambient"), &ambientIntensity, ShaderUniformDataType.Float); SetShaderValue(shader, GetShaderLocation(shader, "ambient"), &ambientIntensity, ShaderUniformDataType.Float);
// Get location for shader parameters that can be modified in real time // Get location for shader parameters that can be modified in real time
int emissiveIntensityLoc = GetShaderLocation(shader, "emissivePower"); var emissiveIntensityLoc = GetShaderLocation(shader, "emissivePower");
int emissiveColorLoc = GetShaderLocation(shader, "emissiveColor"); var emissiveColorLoc = GetShaderLocation(shader, "emissiveColor");
int textureTilingLoc = GetShaderLocation(shader, "tiling"); var textureTilingLoc = GetShaderLocation(shader, "tiling");
// Load old car model using PBR maps and shader // Load old car model using PBR maps and shader
// WARNING: We know this model consists of a single model.meshes[0] and // WARNING: We know this model consists of a single model.meshes[0] and
// that model.materials[0] is by default assigned to that mesh // that model.materials[0] is by default assigned to that mesh
// There could be more complex models consisting of multiple meshes and // There could be more complex models consisting of multiple meshes and
// multiple materials defined for those meshes... but always 1 mesh = 1 material // multiple materials defined for those meshes... but always 1 mesh = 1 material
Model car = LoadModel("resources/models/gltf/old_car_new.glb"); var car = LoadModel("resources/models/gltf/old_car_new.glb");
// Assign already setup PBR shader to model.materials[0], used by models.meshes[0] // Assign already setup PBR shader to model.materials[0], used by models.meshes[0]
car.Materials[0].Shader = shader; car.Materials[0].Shader = shader;
// Setup materials[0].maps default parameters // Setup materials[0].maps default parameters
car.Materials[0].Maps[(int) MaterialMapIndex.Albedo].Color = Color.White; car.Materials[0].Maps[(int)MaterialMapIndex.Albedo].Color = Color.White;
car.Materials[0].Maps[(int) MaterialMapIndex.Metalness].Value = 0.0f; car.Materials[0].Maps[(int)MaterialMapIndex.Metalness].Value = 0.0f;
car.Materials[0].Maps[(int) MaterialMapIndex.Roughness].Value = 0.0f; car.Materials[0].Maps[(int)MaterialMapIndex.Roughness].Value = 0.0f;
car.Materials[0].Maps[(int) MaterialMapIndex.Occlusion].Value = 1.0f; car.Materials[0].Maps[(int)MaterialMapIndex.Occlusion].Value = 1.0f;
car.Materials[0].Maps[(int) MaterialMapIndex.Emission].Color = new Color(255, 162, 0, 255); car.Materials[0].Maps[(int)MaterialMapIndex.Emission].Color = new Color(255, 162, 0, 255);
// Setup materials[0].maps default textures // Setup materials[0].maps default textures
car.Materials[0].Maps[(int) MaterialMapIndex.Albedo].Texture = LoadTexture("resources/old_car_d.png"); car.Materials[0].Maps[(int)MaterialMapIndex.Albedo].Texture = LoadTexture("resources/old_car_d.png");
car.Materials[0].Maps[(int) MaterialMapIndex.Metalness].Texture = LoadTexture("resources/old_car_mra.png"); car.Materials[0].Maps[(int)MaterialMapIndex.Metalness].Texture = LoadTexture("resources/old_car_mra.png");
car.Materials[0].Maps[(int) MaterialMapIndex.Normal].Texture = LoadTexture("resources/old_car_n.png"); car.Materials[0].Maps[(int)MaterialMapIndex.Normal].Texture = LoadTexture("resources/old_car_n.png");
car.Materials[0].Maps[(int) MaterialMapIndex.Emission].Texture = LoadTexture("resources/old_car_e.png"); car.Materials[0].Maps[(int)MaterialMapIndex.Emission].Texture = LoadTexture("resources/old_car_e.png");
// Load floor model mesh and assign material parameters // Load floor model mesh and assign material parameters
// NOTE: A basic plane shape can be generated instead of being loaded from a model file // NOTE: A basic plane shape can be generated instead of being loaded from a model file
Model floor = LoadModel("resources/models/gltf/plane.glb"); var floor = LoadModel("resources/models/gltf/plane.glb");
//Mesh floorMesh = GenMeshPlane(10, 10, 10, 10); //Mesh floorMesh = GenMeshPlane(10, 10, 10, 10);
//GenMeshTangents(&floorMesh); // TODO: Review tangents generation //GenMeshTangents(&floorMesh); // TODO: Review tangents generation
//Model floor = LoadModelFromMesh(floorMesh); //Model floor = LoadModelFromMesh(floorMesh);
@@ -115,30 +112,57 @@ public class BasicPbr
// Assign material shader for our floor model, same PBR shader // Assign material shader for our floor model, same PBR shader
floor.Materials[0].Shader = shader; floor.Materials[0].Shader = shader;
floor.Materials[0].Maps[(int) MaterialMapIndex.Albedo].Color = Color.White; floor.Materials[0].Maps[(int)MaterialMapIndex.Albedo].Color = Color.White;
floor.Materials[0].Maps[(int) MaterialMapIndex.Metalness].Value = 0.0f; floor.Materials[0].Maps[(int)MaterialMapIndex.Metalness].Value = 0.0f;
floor.Materials[0].Maps[(int) MaterialMapIndex.Roughness].Value = 0.0f; floor.Materials[0].Maps[(int)MaterialMapIndex.Roughness].Value = 0.0f;
floor.Materials[0].Maps[(int) MaterialMapIndex.Occlusion].Value = 1.0f; floor.Materials[0].Maps[(int)MaterialMapIndex.Occlusion].Value = 1.0f;
floor.Materials[0].Maps[(int) MaterialMapIndex.Emission].Color = Color.Black; floor.Materials[0].Maps[(int)MaterialMapIndex.Emission].Color = Color.Black;
floor.Materials[0].Maps[(int) MaterialMapIndex.Albedo].Texture = LoadTexture("resources/road_a.png"); floor.Materials[0].Maps[(int)MaterialMapIndex.Albedo].Texture = LoadTexture("resources/road_a.png");
floor.Materials[0].Maps[(int) MaterialMapIndex.Metalness].Texture = LoadTexture("resources/road_mra.png"); floor.Materials[0].Maps[(int)MaterialMapIndex.Metalness].Texture = LoadTexture("resources/road_mra.png");
floor.Materials[0].Maps[(int) MaterialMapIndex.Normal].Texture = LoadTexture("resources/road_n.png"); floor.Materials[0].Maps[(int)MaterialMapIndex.Normal].Texture = LoadTexture("resources/road_n.png");
// Models texture tiling parameter can be stored in the Material struct if required (CURRENTLY NOT USED) // Models texture tiling parameter can be stored in the Material struct if required (CURRENTLY NOT USED)
// NOTE: Material.params[4] are available for generic parameters storage (float) // NOTE: Material.params[4] are available for generic parameters storage (float)
Vector2 carTextureTiling = new Vector2(0.5f, 0.5f); var carTextureTiling = new Vector2(0.5f, 0.5f);
Vector2 floorTextureTiling = new Vector2(0.5f, 0.5f); var floorTextureTiling = new Vector2(0.5f, 0.5f);
// Create some lights // Create some lights
PbrLight[] lights = new PbrLight[4]; var lights = new PbrLight[4];
lights[0] = PbrLights.CreateLight(0, PbrLightType.Point, new Vector3(-1.0f, 1.0f, -2.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Yellow, 4.0f, shader); lights[0] = PbrLights.CreateLight(
lights[1] = PbrLights.CreateLight(1, PbrLightType.Point, new Vector3(2.0f, 1.0f, 1.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Green, 3.3f, shader); 0,
lights[2] = PbrLights.CreateLight(2, PbrLightType.Point, new Vector3(-2.0f, 1.0f, 1.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Red, 8.3f, shader); PbrLightType.Point,
lights[3] = PbrLights.CreateLight(3, PbrLightType.Point, new Vector3(1.0f, 1.0f, -2.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Black, 2.0f, shader); new Vector3(-1.0f, 1.0f, -2.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Yellow,
4.0f,
shader);
lights[1] = PbrLights.CreateLight(1,
PbrLightType.Point,
new Vector3(2.0f, 1.0f, 1.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Green,
3.3f,
shader);
lights[2] = PbrLights.CreateLight(
2, PbrLightType.Point,
new Vector3(-2.0f, 1.0f, 1.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Red,
8.3f,
shader);
lights[3] = PbrLights.CreateLight(
3,
PbrLightType.Point,
new Vector3(1.0f, 1.0f, -2.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Black,
2.0f,
shader);
// Setup material texture maps usage in shader // Setup material texture maps usage in shader
// NOTE: By default, the texture maps are always used // NOTE: By default, the texture maps are always used
int usage = 1; var usage = 1;
SetShaderValue(shader, GetShaderLocation(shader, "useTexAlbedo"), &usage, ShaderUniformDataType.Int); SetShaderValue(shader, GetShaderLocation(shader, "useTexAlbedo"), &usage, ShaderUniformDataType.Int);
SetShaderValue(shader, GetShaderLocation(shader, "useTexNormal"), &usage, ShaderUniformDataType.Int); SetShaderValue(shader, GetShaderLocation(shader, "useTexNormal"), &usage, ShaderUniformDataType.Int);
SetShaderValue(shader, GetShaderLocation(shader, "useTexMRA"), &usage, ShaderUniformDataType.Int); SetShaderValue(shader, GetShaderLocation(shader, "useTexMRA"), &usage, ShaderUniformDataType.Int);
@@ -155,17 +179,32 @@ public class BasicPbr
UpdateCamera(&camera, CameraMode.Orbital); UpdateCamera(&camera, CameraMode.Orbital);
// Update the shader with the camera view vector (points towards { 0.0f, 0.0f, 0.0f }) // Update the shader with the camera view vector (points towards { 0.0f, 0.0f, 0.0f })
Vector3 cameraPos = camera.Position; var cameraPos = camera.Position;
SetShaderValue(shader, shader.Locs[(int) ShaderLocationIndex.VectorView], cameraPos, ShaderUniformDataType.Vec3); SetShaderValue(shader, shader.Locs[(int)ShaderLocationIndex.VectorView], cameraPos, ShaderUniformDataType.Vec3);
// Check key inputs to enable/disable lights // Check key inputs to enable/disable lights
if (IsKeyPressed(KeyboardKey.One)) { lights[2].Enabled = !lights[2].Enabled; } if (IsKeyPressed(KeyboardKey.One))
if (IsKeyPressed(KeyboardKey.Two)) { lights[1].Enabled = !lights[1].Enabled; } {
if (IsKeyPressed(KeyboardKey.Three)) { lights[3].Enabled = !lights[3].Enabled; } lights[2].Enabled = !lights[2].Enabled;
if (IsKeyPressed(KeyboardKey.Four)) { lights[0].Enabled = !lights[0].Enabled; } }
if (IsKeyPressed(KeyboardKey.Two))
{
lights[1].Enabled = !lights[1].Enabled;
}
if (IsKeyPressed(KeyboardKey.Three))
{
lights[3].Enabled = !lights[3].Enabled;
}
if (IsKeyPressed(KeyboardKey.Four))
{
lights[0].Enabled = !lights[0].Enabled;
}
// Update light values on shader (actually, only enable/disable them) // Update light values on shader (actually, only enable/disable them)
for (int i = 0; i < 4; i++) for (var i = 0; i < 4; i++)
{ {
UpdateLight(shader, lights[i]); UpdateLight(shader, lights[i]);
} }
@@ -181,30 +220,26 @@ public class BasicPbr
// Set floor model texture tiling and emissive color parameters on shader // Set floor model texture tiling and emissive color parameters on shader
SetShaderValue(shader, textureTilingLoc, &floorTextureTiling, ShaderUniformDataType.Vec2); SetShaderValue(shader, textureTilingLoc, &floorTextureTiling, ShaderUniformDataType.Vec2);
Vector4 floorEmissiveColor = ColorNormalize(floor.Materials[0].Maps[(int) MaterialMapIndex.Emission].Color); var floorEmissiveColor = ColorNormalize(floor.Materials[0].Maps[(int)MaterialMapIndex.Emission].Color);
SetShaderValue(shader, emissiveColorLoc, &floorEmissiveColor, ShaderUniformDataType.Vec4); SetShaderValue(shader, emissiveColorLoc, &floorEmissiveColor, ShaderUniformDataType.Vec4);
DrawModel(floor, Vector3.Zero, 5.0f, Color.White); // Draw floor model DrawModel(floor, Vector3.Zero, 5.0f, Color.White); // Draw floor model
// Set old car model texture tiling, emissive color and emissive intensity parameters on shader // Set old car model texture tiling, emissive color and emissive intensity parameters on shader
SetShaderValue(shader, textureTilingLoc, &carTextureTiling, ShaderUniformDataType.Vec2); SetShaderValue(shader, textureTilingLoc, &carTextureTiling, ShaderUniformDataType.Vec2);
Vector4 carEmissiveColor = ColorNormalize(car.Materials[0].Maps[(int) MaterialMapIndex.Emission].Color); var carEmissiveColor = ColorNormalize(car.Materials[0].Maps[(int)MaterialMapIndex.Emission].Color);
SetShaderValue(shader, emissiveColorLoc, &carEmissiveColor, ShaderUniformDataType.Vec4); SetShaderValue(shader, emissiveColorLoc, &carEmissiveColor, ShaderUniformDataType.Vec4);
float emissiveIntensity = 0.01f; var emissiveIntensity = 0.01f;
SetShaderValue(shader, emissiveIntensityLoc, &emissiveIntensity, ShaderUniformDataType.Float); SetShaderValue(shader, emissiveIntensityLoc, &emissiveIntensity, ShaderUniformDataType.Float);
DrawModel(car, Vector3.Zero, 0.005f, Color.White); // Draw car model DrawModel(car, Vector3.Zero, 0.005f, Color.White); // Draw car model
// Draw spheres to show the lights positions // Draw spheres to show the lights positions
for (int i = 0; i < 4; i++) for (var i = 0; i < 4; i++)
{ {
var color = lights[i].Color; var color = lights[i].Color;
var lightColor = new Color( var lightColor = new Color((byte)(color.X * 255), (byte)(color.Y * 255), (byte)(color.Z * 255),
(byte)(color.X * 255), (byte)(color.W * 255));
(byte)(color.Y * 255),
(byte)(color.Z * 255),
(byte)(color.W * 255)
);
if (lights[i].Enabled) if (lights[i].Enabled)
{ {
@@ -249,7 +284,7 @@ public class BasicPbr
return 0; return 0;
} }
static void UpdateLight(Shader shader, PbrLight light) private static void UpdateLight(Shader shader, PbrLight light)
{ {
SetShaderValue(shader, light.EnabledLoc, light.Enabled, ShaderUniformDataType.Int); SetShaderValue(shader, light.EnabledLoc, light.Enabled, ShaderUniformDataType.Int);
SetShaderValue(shader, light.TypeLoc, light.Type, ShaderUniformDataType.Int); SetShaderValue(shader, light.TypeLoc, light.Type, ShaderUniformDataType.Int);