* basic pbr example pbr implementation includes rpbr.h and few shader files header only file, which self contain everything needed for pbr rendering. Few textures and one model of the car which is under free licence which is included inside basic_pbr.c example file currently supported shader versions are 120 and 330 , version 100 has small issue which I have to resolve * Unloading PBRMAterial I forgot unloading PBRMaterial * fix small issue with texOffset assigment. value was Vector4 at first but I found out it would be unclear for and users, so I change to have two Vector2 instead, but forgot to assign offset . * Changed size of textures and file name changed Changed size of textures from 2048x2048 to 1024x1024 and file name changed to shaders_basic_pbr.c , Added the function PBRModel PBRModelLoadFromMesh(Mesh mesh); but GenMeshPlane(2, 2.0, 3, 3) culdn't be used because it crash once GenMeshTangents() is used with that plane mesh
466 lines
18 KiB
C
466 lines
18 KiB
C
/**********************************************************************************************
|
|
*
|
|
* raylib.pbr - Some useful functions to deal with pbr materials and lights
|
|
*
|
|
* CONFIGURATION:
|
|
*
|
|
* #define RPBR_IMPLEMENTATION
|
|
* Generates the implementation of the library into the included file.
|
|
* If not defined, the library is in header only mode and can be included in other headers
|
|
* or source files without problems. But only ONE file should hold the implementation.
|
|
*
|
|
* LICENSE: zlib/libpng
|
|
*
|
|
* Copyright (c) 2023-2024 Afan OLOVCIC (@_DevDad) 2017-2020 Victor Fisac(@victorfisac),Ramon Santamaria (@raysan5)
|
|
*
|
|
* This software is provided "as-is", without any express or implied warranty. In no event
|
|
* will the authors be held liable for any damages arising from the use of this software.
|
|
*
|
|
* Permission is granted to anyone to use this software for any purpose, including commercial
|
|
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
*
|
|
* 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
* wrote the original software. If you use this software in a product, an acknowledgment
|
|
* in the product documentation would be appreciated but is not required.
|
|
*
|
|
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
* as being the original software.
|
|
*
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
*
|
|
**********************************************************************************************/
|
|
|
|
#ifndef RPBR_H
|
|
#define RPBR_H
|
|
#include "raylib.h"
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
// Defines and Macros
|
|
//----------------------------------------------------------------------------------
|
|
#define MAX_LIGHTS 4 // Max dynamic lights supported by shader
|
|
#define SHADER_LOC_MAP_MRA SHADER_LOC_MAP_METALNESS //METALLIC, ROUGHNESS and AO
|
|
#define SHADER_LOC_MAP_EMISSIVE SHADER_LOC_MAP_HEIGHT //EMISSIVE
|
|
#define MATERIAL_MAP_MRA MATERIAL_MAP_METALNESS
|
|
#define MATERIAL_MAP_EMISSIVE MATERIAL_MAP_HEIGHT
|
|
#define NULL 0
|
|
#define COLOR_TO_ARRAY(c)
|
|
|
|
typedef struct {
|
|
int enabled;
|
|
int type;
|
|
Vector3 position;
|
|
Vector3 target;
|
|
float color[4];
|
|
float intensity;
|
|
|
|
int enabledLoc;
|
|
int typeLoc;
|
|
int positionLoc;
|
|
int targetLoc;
|
|
int colorLoc;
|
|
int intensityLoc;
|
|
} PBRLight;
|
|
|
|
typedef enum {
|
|
LIGHT_DIRECTIONAL = 0,
|
|
LIGHT_POINT,
|
|
LIGHT_SPOT
|
|
} PBRLightType;
|
|
|
|
typedef struct{
|
|
Shader pbrShader;
|
|
Shader skyShader;
|
|
unsigned int cubemap;
|
|
unsigned int irradiance;
|
|
unsigned int prefilter;
|
|
unsigned int brdf;
|
|
int modelMatrixLoc;
|
|
int pbrViewLoc;
|
|
int skyViewLoc;
|
|
int skyResolutionLoc;
|
|
} PBREnvironment;
|
|
|
|
typedef enum{
|
|
PBR_COLOR_ALBEDO = 0,
|
|
PBR_COLOR_EMISSIVE
|
|
}PBRColorType;
|
|
|
|
typedef enum{
|
|
PBR_VEC2_TILING = 0,
|
|
PBR_VEC2_OFFSET
|
|
}PBRVec2Type;
|
|
|
|
typedef enum{
|
|
PBR_PARAM_NORMAL =0,
|
|
PBR_PARAM_METALLIC,
|
|
PBR_PARAM_ROUGHNESS,
|
|
PBR_PARAM_EMISSIVE,
|
|
PBR_PARAM_AO
|
|
}PBRFloatType;
|
|
|
|
typedef enum{
|
|
PBR_TEXTURE_ALBEDO = 0,
|
|
PBR_TEXTURE_NORMAL,
|
|
PBR_TEXTURE_MRA,
|
|
PBR_TEXTURE_EMISSIVE
|
|
}PBRTexType;
|
|
|
|
// Textures are moved to material from params to pack better and use less textures on the end
|
|
// texture MRAE 4Channel R: Metallic G: Roughness B: A: Ambient Occlusion
|
|
// texEmissive use just one channel, so we have 3 channels still to use if we need
|
|
typedef struct {
|
|
Shader pbrShader;
|
|
float albedo[4];
|
|
float normal;
|
|
float metallic;
|
|
float roughness;
|
|
float ao;
|
|
float emissive[4];
|
|
float ambient[3];
|
|
float emissivePower;
|
|
|
|
Texture2D texAlbedo;
|
|
Texture2D texNormal;
|
|
Texture2D texMRA;//r: Metallic g: Roughness b: AO a:Empty
|
|
Texture2D texEmissive; //Emissive Texture
|
|
// Using float4 to store tilling at 1st and 2nd position and offset at 3rd and 4th
|
|
float texTiling[2];
|
|
float texOffset[2];
|
|
|
|
int useTexAlbedo;
|
|
int useTexNormal;
|
|
int useTexMRA;
|
|
int useTexEmissive;
|
|
|
|
int albedoLoc;
|
|
int normalLoc;
|
|
int metallicLoc;
|
|
int roughnessLoc;
|
|
int aoLoc;
|
|
int emissiveColorLoc;
|
|
int emissivePowerLoc;
|
|
|
|
int texTilingLoc;
|
|
int texOffsetLoc;
|
|
|
|
int useTexAlbedoLoc;
|
|
int useTexNormalLoc;
|
|
int useTexMRAELoc;
|
|
int useTexEmissiveLoc;
|
|
} PBRMaterial;
|
|
|
|
typedef struct{
|
|
Model model;
|
|
PBRMaterial pbrMat;
|
|
}PBRModel;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
// Module Functions Declaration
|
|
//----------------------------------------------------------------------------------
|
|
|
|
// Create a light and get shader locations
|
|
PBRLight PBRLightCreate(int type, Vector3 position, Vector3 target, Color color,float intensity, Shader shader);
|
|
// Send light properties to shader
|
|
void PBRLightUpdate(Shader shader, PBRLight light);
|
|
|
|
//For now until we do real skylight
|
|
void PBRSetAmbient(Shader shader, Color color, float intensity);
|
|
|
|
PBRModel PBRModelLoad(const char *fileName);
|
|
PBRModel PBRModelLoadFromMesh(Mesh mesh);
|
|
|
|
void PBRLoadTextures(PBRMaterial *pbrMat,PBRTexType pbrTexType,const char *fileName);
|
|
void UnloadPBRMaterial(PBRMaterial pbrMat);
|
|
void PBRSetColor(PBRMaterial *pbrMat,PBRColorType pbrColorType,Color color);
|
|
void PBRSetVec2(PBRMaterial *pbrMat,PBRVec2Type type,Vector2 value);
|
|
void PBRSetFloat(PBRMaterial *pbrMat, PBRFloatType pbrParamType, float value);
|
|
|
|
void PBRMaterialSetup( PBRMaterial *pbrMat,Shader pbrShader, PBREnvironment* environment);
|
|
void PBRSetMaterial(PBRModel* model,PBRMaterial* pbrMat,int matIndex);
|
|
void PBRDrawModel(PBRModel pbrModel, Vector3 position, float scale);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif //RPBR_H
|
|
|
|
/***********************************************************************************
|
|
*
|
|
* RPBR IMPLEMENTATION
|
|
*
|
|
************************************************************************************/
|
|
|
|
#if defined(RPBR_IMPLEMENTATION)
|
|
|
|
//----------------------------------------------------------------------------------
|
|
// Global Variables Definition
|
|
//----------------------------------------------------------------------------------
|
|
static int lightsCount = 0; // Current amount of created lights
|
|
|
|
// Create a light and get shader locations
|
|
PBRLight PBRLightCreate(int type, Vector3 position, Vector3 target, Color color,float intensity, Shader shader)
|
|
{
|
|
PBRLight light = { 0 };
|
|
|
|
if (lightsCount < MAX_LIGHTS)
|
|
{
|
|
light.enabled = 1;
|
|
light.type = type;
|
|
light.position = position;
|
|
light.target = target;
|
|
light.color[0] = (float)color.r/(float)255;
|
|
light.color[1] = (float)color.g/(float)255;
|
|
light.color[2] = (float)color.b/(float)255;
|
|
light.color[3] = (float)color.a/(float)255;
|
|
light.intensity = intensity;
|
|
// NOTE: Lighting shader naming must be the provided ones
|
|
light.enabledLoc = GetShaderLocation(shader, TextFormat("lights[%i].enabled", lightsCount));
|
|
light.typeLoc = GetShaderLocation(shader, TextFormat("lights[%i].type", lightsCount));
|
|
light.positionLoc = GetShaderLocation(shader, TextFormat("lights[%i].position", lightsCount));
|
|
light.targetLoc = GetShaderLocation(shader, TextFormat("lights[%i].target", lightsCount));
|
|
light.colorLoc = GetShaderLocation(shader, TextFormat("lights[%i].color", lightsCount));
|
|
light.intensityLoc = GetShaderLocation(shader, TextFormat("lights[%i].intensity", lightsCount));
|
|
PBRLightUpdate(shader, light);
|
|
|
|
lightsCount++;
|
|
}
|
|
|
|
return light;
|
|
}
|
|
|
|
// Send light properties to shader
|
|
// NOTE: Light shader locations should be available
|
|
void PBRLightUpdate(Shader shader, PBRLight light)
|
|
{
|
|
SetShaderValue(shader, light.enabledLoc, &light.enabled, SHADER_UNIFORM_INT);
|
|
SetShaderValue(shader, light.typeLoc, &light.type, SHADER_UNIFORM_INT);
|
|
// Send to shader light position values
|
|
float position[3] = { light.position.x, light.position.y, light.position.z };
|
|
SetShaderValue(shader, light.positionLoc, position, SHADER_UNIFORM_VEC3);
|
|
|
|
// Send to shader light target position values
|
|
float target[3] = { light.target.x, light.target.y, light.target.z };
|
|
SetShaderValue(shader, light.targetLoc, target, SHADER_UNIFORM_VEC3);
|
|
SetShaderValue(shader, light.colorLoc, light.color, SHADER_UNIFORM_VEC4);
|
|
SetShaderValue(shader, light.intensityLoc, &light.intensity, SHADER_UNIFORM_FLOAT);
|
|
}
|
|
|
|
void PBRSetAmbient(Shader shader, Color color, float intensity){
|
|
float col[3] = {color.r/255,color.g/255,color.b/255};
|
|
SetShaderValue(shader, GetShaderLocation(shader, "ambientColor"), col, SHADER_UNIFORM_VEC3);
|
|
SetShaderValue(shader, GetShaderLocation(shader, "ambient"), &intensity, SHADER_UNIFORM_FLOAT);
|
|
}
|
|
|
|
void PBRMaterialSetup(PBRMaterial *pbrMat, Shader pbrShader, PBREnvironment* environment){
|
|
pbrMat->pbrShader = pbrShader;
|
|
|
|
pbrMat->texAlbedo = (Texture2D){0};
|
|
pbrMat->texNormal = (Texture2D){0};
|
|
pbrMat->texMRA = (Texture2D){0};
|
|
pbrMat->texEmissive = (Texture2D){0};
|
|
|
|
//PBRParam
|
|
pbrMat->albedo[0] = 1.0;
|
|
pbrMat->albedo[1] = 1.0;
|
|
pbrMat->albedo[2] = 1.0;
|
|
pbrMat->albedo[3] = 1.0;
|
|
pbrMat->metallic = 0;
|
|
pbrMat->roughness = 0;
|
|
pbrMat->ao = 1.0;
|
|
pbrMat->normal = 1;
|
|
pbrMat->emissive[0] = 0;
|
|
pbrMat->emissive[1] = 0;
|
|
pbrMat->emissive[2] = 0;
|
|
pbrMat->emissive[3] = 0;
|
|
|
|
pbrMat->texTiling[0] = 1.0;
|
|
pbrMat->texTiling[1] = 1.0;
|
|
pbrMat->texOffset[0] = 0.0;
|
|
pbrMat->texOffset[1] = 0.0;
|
|
pbrMat->emissivePower = 1.0;
|
|
// Set up PBR shader material locations
|
|
|
|
pbrMat->albedoLoc = GetShaderLocation(pbrMat->pbrShader, "albedoColor");
|
|
pbrMat->normalLoc = GetShaderLocation(pbrMat->pbrShader, "normalValue");
|
|
pbrMat->metallicLoc = GetShaderLocation(pbrMat->pbrShader, "metallicValue");
|
|
pbrMat->roughnessLoc = GetShaderLocation(pbrMat->pbrShader, "roughnessValue");
|
|
pbrMat->aoLoc = GetShaderLocation(pbrMat->pbrShader, "aoValue");
|
|
pbrMat->emissiveColorLoc = GetShaderLocation(pbrMat->pbrShader, "emissiveColor");
|
|
pbrMat->emissivePowerLoc = GetShaderLocation(pbrMat->pbrShader, "emissivePower");
|
|
|
|
pbrMat->texTilingLoc = GetShaderLocation(pbrMat->pbrShader, "tiling");
|
|
pbrMat->texOffsetLoc = GetShaderLocation(pbrMat->pbrShader, "offset");
|
|
|
|
pbrMat->useTexAlbedoLoc = GetShaderLocation(pbrMat->pbrShader, "useTexAlbedo");
|
|
pbrMat->useTexNormalLoc = GetShaderLocation(pbrMat->pbrShader, "useTexNormal");
|
|
pbrMat->useTexMRAELoc = GetShaderLocation(pbrMat->pbrShader, "useTexMRA");
|
|
pbrMat->useTexEmissiveLoc = GetShaderLocation(pbrMat->pbrShader, "useTexEmissive");
|
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->albedoLoc,pbrMat->albedo,SHADER_UNIFORM_VEC4);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissiveColorLoc, pbrMat->emissive, SHADER_UNIFORM_VEC4);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissivePowerLoc, &pbrMat->emissivePower, SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->metallicLoc,&pbrMat->metallic,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->roughnessLoc,&pbrMat->roughness,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->aoLoc,&pbrMat->ao,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->normalLoc,&pbrMat->normal,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texTilingLoc,pbrMat->texTiling,SHADER_UNIFORM_VEC2);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texOffsetLoc,pbrMat->texOffset,SHADER_UNIFORM_VEC2);
|
|
}
|
|
|
|
void PBRLoadTextures(PBRMaterial *pbrMat,PBRTexType pbrTexType,const char *fileName){
|
|
if(pbrMat == NULL) return;
|
|
switch(pbrTexType){
|
|
case PBR_TEXTURE_ALBEDO:
|
|
pbrMat->texAlbedo = LoadTexture(fileName);
|
|
pbrMat->useTexAlbedo = 1;
|
|
break;
|
|
case PBR_TEXTURE_MRA:
|
|
pbrMat->texMRA = LoadTexture(fileName);
|
|
pbrMat->useTexMRA = 1;
|
|
break;
|
|
case PBR_TEXTURE_NORMAL:
|
|
pbrMat->texNormal = LoadTexture(fileName);
|
|
pbrMat->useTexNormal = 1;
|
|
break;
|
|
case PBR_TEXTURE_EMISSIVE:
|
|
pbrMat->texEmissive = LoadTexture(fileName);
|
|
pbrMat->useTexEmissive = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UnloadPBRMaterial(PBRMaterial pbrMat){
|
|
if(pbrMat.useTexAlbedo == 1) UnloadTexture(pbrMat.texAlbedo);
|
|
if(pbrMat.useTexNormal == 1) UnloadTexture(pbrMat.texNormal);
|
|
if(pbrMat.useTexMRA == 1) UnloadTexture(pbrMat.texMRA);
|
|
if(pbrMat.useTexEmissive == 1) UnloadTexture(pbrMat.texEmissive);
|
|
}
|
|
|
|
void PBRSetColor(PBRMaterial *pbrMat,PBRColorType pbrColorType,Color color){
|
|
if(pbrMat == NULL) return;
|
|
switch(pbrColorType){
|
|
case PBR_COLOR_ALBEDO:
|
|
pbrMat->albedo[0] = (float) color.r / 255;
|
|
pbrMat->albedo[1] = (float) color.g / 255;
|
|
pbrMat->albedo[2] = (float) color.b / 255;
|
|
pbrMat->albedo[3] = (float) color.a / 255;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->albedoLoc,pbrMat->albedo,SHADER_UNIFORM_VEC4);
|
|
break;
|
|
case PBR_COLOR_EMISSIVE:
|
|
pbrMat->emissive[0] = (float) color.r / 255;
|
|
pbrMat->emissive[1] = (float) color.g / 255;
|
|
pbrMat->emissive[2] = (float) color.b / 255;
|
|
pbrMat->emissive[3] = (float) color.a / 255;
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissiveColorLoc, pbrMat->emissive, SHADER_UNIFORM_VEC4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PBRSetFloat(PBRMaterial *pbrMat, PBRFloatType pbrParamType, float value){
|
|
if(pbrMat == NULL) return;
|
|
switch(pbrParamType){
|
|
case PBR_PARAM_METALLIC:
|
|
pbrMat->metallic = value;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->metallicLoc,&pbrMat->metallic,SHADER_UNIFORM_FLOAT);
|
|
break;
|
|
case PBR_PARAM_ROUGHNESS:
|
|
pbrMat->roughness = value;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->roughnessLoc,&pbrMat->roughness,SHADER_UNIFORM_FLOAT);
|
|
break;
|
|
case PBR_PARAM_NORMAL:
|
|
pbrMat->normal = value;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->normalLoc,&pbrMat->normal,SHADER_UNIFORM_FLOAT);
|
|
break;
|
|
case PBR_PARAM_AO:
|
|
pbrMat->ao = value;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->aoLoc,&pbrMat->ao,SHADER_UNIFORM_FLOAT);
|
|
break;
|
|
case PBR_PARAM_EMISSIVE:
|
|
pbrMat->emissivePower = value;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->emissivePowerLoc,&pbrMat->emissivePower,SHADER_UNIFORM_FLOAT);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void PBRSetVec2(PBRMaterial *pbrMat,PBRVec2Type type,Vector2 value){
|
|
switch(type){
|
|
case PBR_VEC2_TILING:
|
|
pbrMat->texTiling[0] = value.x;
|
|
pbrMat->texTiling[1] = value.y;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texTilingLoc,&pbrMat->texTiling,SHADER_UNIFORM_VEC2);
|
|
break;
|
|
case PBR_VEC2_OFFSET:
|
|
pbrMat->texOffset[0] = value.x;
|
|
pbrMat->texOffset[1] = value.y;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texOffsetLoc,&pbrMat->texOffset,SHADER_UNIFORM_VEC2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PBRSetMaterial(PBRModel* model,PBRMaterial* pbrMat,int matIndex){
|
|
|
|
|
|
model->pbrMat = *pbrMat;
|
|
model->model.materials[matIndex].shader = model->pbrMat.pbrShader;
|
|
pbrMat->pbrShader.locs[SHADER_LOC_MAP_MRA] = GetShaderLocation(pbrMat->pbrShader, "mraMap");
|
|
pbrMat->pbrShader.locs[SHADER_LOC_MAP_EMISSIVE] = GetShaderLocation(pbrMat->pbrShader, "emissiveMap");
|
|
pbrMat->pbrShader.locs[SHADER_LOC_MAP_NORMAL] = GetShaderLocation(pbrMat->pbrShader, "normalMap");
|
|
|
|
if(pbrMat->useTexAlbedo) {
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_ALBEDO].texture = pbrMat->texAlbedo;
|
|
}
|
|
if(pbrMat->useTexMRA) {
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_MRA].texture = pbrMat->texMRA;
|
|
}
|
|
if(pbrMat->useTexNormal) {
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_NORMAL].texture = pbrMat->texNormal;
|
|
}
|
|
if(pbrMat->useTexEmissive) {
|
|
model->model.materials[matIndex].maps[MATERIAL_MAP_EMISSIVE].texture = pbrMat->texEmissive;
|
|
}
|
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexAlbedoLoc,&pbrMat->useTexAlbedo,SHADER_UNIFORM_INT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexNormalLoc,&pbrMat->useTexNormal,SHADER_UNIFORM_INT);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexMRAELoc, &pbrMat->useTexMRA, SHADER_UNIFORM_INT);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexEmissiveLoc, &pbrMat->useTexEmissive, SHADER_UNIFORM_INT);
|
|
}
|
|
|
|
void PBRDrawModel(PBRModel pbrModel, Vector3 position, float scale){
|
|
PBRMaterial *pbrMat = &pbrModel.pbrMat;
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->albedoLoc,pbrMat->albedo,SHADER_UNIFORM_VEC4);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->emissiveColorLoc, pbrMat->emissive, SHADER_UNIFORM_VEC4);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->metallicLoc,&pbrMat->metallic,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->roughnessLoc,&pbrMat->roughness,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->aoLoc,&pbrMat->ao,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->normalLoc,&pbrMat->normal,SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texTilingLoc,pbrMat->texTiling,SHADER_UNIFORM_VEC2);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->texOffsetLoc,pbrMat->texOffset,SHADER_UNIFORM_VEC2);
|
|
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexAlbedoLoc,&pbrMat->useTexAlbedo,SHADER_UNIFORM_INT);
|
|
SetShaderValue(pbrMat->pbrShader,pbrMat->useTexNormalLoc,&pbrMat->useTexNormal,SHADER_UNIFORM_INT);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexMRAELoc, &pbrMat->useTexMRA, SHADER_UNIFORM_INT);
|
|
SetShaderValue(pbrMat->pbrShader, pbrMat->useTexEmissiveLoc, &pbrMat->useTexEmissive, SHADER_UNIFORM_INT);
|
|
|
|
DrawModel(pbrModel.model,position,scale,WHITE);
|
|
}
|
|
|
|
PBRModel PBRModelLoad(const char *fileName){
|
|
PBRModel pbrModel = (PBRModel){0};
|
|
pbrModel.model = LoadModel(fileName);
|
|
return pbrModel;
|
|
}
|
|
|
|
PBRModel PBRModelLoadFromMesh(Mesh mesh){
|
|
PBRModel pbrModel = (PBRModel){0};
|
|
pbrModel.model = LoadModelFromMesh(mesh);
|
|
return pbrModel;
|
|
}
|
|
#endif // RPBR_IMPLEMENTATION
|