mirror of
https://github.com/raylib-cs/raylib-cs
synced 2025-06-30 19:03:42 -04:00
Add PBR Shader Example. (#229)
This commit is contained in:
99
Examples/Shared/PbrLights.cs
Normal file
99
Examples/Shared/PbrLights.cs
Normal file
@ -0,0 +1,99 @@
|
||||
using static Raylib_cs.Raylib;
|
||||
using System.Numerics;
|
||||
|
||||
namespace Examples.Shared;
|
||||
|
||||
public struct PbrLight
|
||||
{
|
||||
public PbrLightType Type;
|
||||
public bool Enabled;
|
||||
public Vector3 Position;
|
||||
public Vector3 Target;
|
||||
public Vector4 Color;
|
||||
public float Intensity;
|
||||
|
||||
// Shader light parameters locations
|
||||
public int TypeLoc;
|
||||
public int EnabledLoc;
|
||||
public int PositionLoc;
|
||||
public int TargetLoc;
|
||||
public int ColorLoc;
|
||||
public int IntensityLoc;
|
||||
}
|
||||
|
||||
public enum PbrLightType
|
||||
{
|
||||
Directorional,
|
||||
Point,
|
||||
Spot
|
||||
}
|
||||
|
||||
public class PbrLights
|
||||
{
|
||||
public static PbrLight CreateLight(
|
||||
int lightsCount,
|
||||
PbrLightType type,
|
||||
Vector3 pos,
|
||||
Vector3 target,
|
||||
Color color,
|
||||
float intensity,
|
||||
Shader shader
|
||||
)
|
||||
{
|
||||
PbrLight light = new();
|
||||
|
||||
light.Enabled = true;
|
||||
light.Type = type;
|
||||
light.Position = pos;
|
||||
light.Target = target;
|
||||
light.Color = new Vector4(
|
||||
color.R / 255.0f,
|
||||
color.G / 255.0f,
|
||||
color.B / 255.0f,
|
||||
color.A / 255.0f
|
||||
);
|
||||
light.Intensity = intensity;
|
||||
|
||||
string enabledName = "lights[" + lightsCount + "].enabled";
|
||||
string typeName = "lights[" + lightsCount + "].type";
|
||||
string posName = "lights[" + lightsCount + "].position";
|
||||
string targetName = "lights[" + lightsCount + "].target";
|
||||
string colorName = "lights[" + lightsCount + "].color";
|
||||
string intensityName = "lights[" + lightsCount + "].intensity";
|
||||
|
||||
light.EnabledLoc = GetShaderLocation(shader, enabledName);
|
||||
light.TypeLoc = GetShaderLocation(shader, typeName);
|
||||
light.PositionLoc = GetShaderLocation(shader, posName);
|
||||
light.TargetLoc = GetShaderLocation(shader, targetName);
|
||||
light.ColorLoc = GetShaderLocation(shader, colorName);
|
||||
light.IntensityLoc = GetShaderLocation(shader, intensityName);
|
||||
|
||||
UpdateLightValues(shader, light);
|
||||
|
||||
return light;
|
||||
}
|
||||
|
||||
public static void UpdateLightValues(Shader shader, PbrLight light)
|
||||
{
|
||||
// Send to shader light enabled state and type
|
||||
Raylib.SetShaderValue(
|
||||
shader,
|
||||
light.EnabledLoc,
|
||||
light.Enabled ? 1 : 0,
|
||||
ShaderUniformDataType.Int
|
||||
);
|
||||
Raylib.SetShaderValue(shader, light.TypeLoc, (int)light.Type, ShaderUniformDataType.Int);
|
||||
|
||||
// Send to shader light target position values
|
||||
Raylib.SetShaderValue(shader, light.PositionLoc, light.Position, ShaderUniformDataType.Vec3);
|
||||
|
||||
// Send to shader light target position values
|
||||
Raylib.SetShaderValue(shader, light.TargetLoc, light.Target, ShaderUniformDataType.Vec3);
|
||||
|
||||
// Send to shader light color values
|
||||
Raylib.SetShaderValue(shader, light.ColorLoc, light.Color, ShaderUniformDataType.Vec4);
|
||||
|
||||
// Send to shader light intensity values
|
||||
Raylib.SetShaderValue(shader, light.IntensityLoc, light.Intensity, ShaderUniformDataType.Float);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user