浏览代码

Merge pull request #122 from victorfisac/develop

Standard Lighting (3/3)
pull/124/head
Ray 9 年前
父节点
当前提交
4b93349db5
共有 9 个文件被更改,包括 89 次插入6467 次删除
  1. 二进制
      examples/resources/model/dwarf_normal.png
  2. 二进制
      examples/resources/model/dwarf_specular.png
  3. +0
    -6433
      examples/resources/model/shapes.obj
  4. +31
    -13
      examples/resources/shaders/standard.fs
  5. +11
    -6
      examples/shaders_standard_lighting.c
  6. +21
    -2
      src/models.c
  7. +3
    -2
      src/raylib.h
  8. +21
    -9
      src/rlgl.c
  9. +2
    -2
      src/rlgl.h

二进制
examples/resources/model/dwarf_normal.png 查看文件

之前 之后
宽度: 2048  |  高度: 2048  |  大小: 3.9 MiB

二进制
examples/resources/model/dwarf_specular.png 查看文件

之前 之后
宽度: 2048  |  高度: 2048  |  大小: 2.8 MiB

+ 0
- 6433
examples/resources/model/shapes.obj
文件差异内容过多而无法显示
查看文件


+ 31
- 13
examples/resources/shaders/standard.fs 查看文件

@ -8,12 +8,18 @@ in vec3 fragNormal;
out vec4 finalColor; out vec4 finalColor;
uniform sampler2D texture0; uniform sampler2D texture0;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform vec4 colTint;
uniform vec4 colAmbient; uniform vec4 colAmbient;
uniform vec4 colDiffuse; uniform vec4 colDiffuse;
uniform vec4 colSpecular; uniform vec4 colSpecular;
uniform float glossiness; uniform float glossiness;
uniform int useNormal;
uniform int useSpecular;
uniform mat4 modelMatrix; uniform mat4 modelMatrix;
uniform vec3 viewDir; uniform vec3 viewDir;
@ -24,7 +30,7 @@ struct Light {
vec3 direction; vec3 direction;
vec4 diffuse; vec4 diffuse;
float intensity; float intensity;
float attenuation;
float radius;
float coneAngle; float coneAngle;
}; };
@ -32,27 +38,27 @@ const int maxLights = 8;
uniform int lightsCount; uniform int lightsCount;
uniform Light lights[maxLights]; uniform Light lights[maxLights];
vec3 CalcPointLight(Light l, vec3 n, vec3 err">v)
vec3 CalcPointLight(Light l, vec3 n, vec3 nf">v, float s)
{ {
vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1));
vec3 surfaceToLight = l.position - surfacePos; vec3 surfaceToLight = l.position - surfacePos;
// Diffuse shading // Diffuse shading
float brightness = clamp(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n)), 0, 1); float brightness = clamp(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n)), 0, 1);
float diff = 1.0/dot(surfaceToLight/l.attenuation, surfaceToLight/l.attenuation)*brightness*l.intensity;
float diff = 1.0/dot(surfaceToLight/l.radius, surfaceToLight/l.radius)*brightness*l.intensity;
// Specular shading // Specular shading
float spec = 0.0; float spec = 0.0;
if (diff > 0.0) if (diff > 0.0)
{ {
vec3 h = normalize(-l.direction + v); vec3 h = normalize(-l.direction + v);
spec = pow(dot(n, h), 3 + glossiness);
spec = pow(dot(n, h), 3 + glossiness)*s;
} }
return (diff*l.diffuse.rgb*colDiffuse.rgb + spec*colSpecular.rgb); return (diff*l.diffuse.rgb*colDiffuse.rgb + spec*colSpecular.rgb);
} }
vec3 CalcDirectionalLight(Light l, vec3 n, vec3 err">v)
vec3 CalcDirectionalLight(Light l, vec3 n, vec3 nf">v, float s)
{ {
vec3 lightDir = normalize(-l.direction); vec3 lightDir = normalize(-l.direction);
@ -64,14 +70,14 @@ vec3 CalcDirectionalLight(Light l, vec3 n, vec3 v)
if (diff > 0.0) if (diff > 0.0)
{ {
vec3 h = normalize(lightDir + v); vec3 h = normalize(lightDir + v);
spec = pow(dot(n, h), 3 + glossiness);
spec = pow(dot(n, h), 3 + glossiness)*s;
} }
// Combine results // Combine results
return (diff*l.intensity*l.diffuse.rgb*colDiffuse.rgb + spec*colSpecular.rgb); return (diff*l.intensity*l.diffuse.rgb*colDiffuse.rgb + spec*colSpecular.rgb);
} }
vec3 CalcSpotLight(Light l, vec3 n, vec3 err">v)
vec3 CalcSpotLight(Light l, vec3 n, vec3 nf">v, float s)
{ {
vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1)); vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1));
vec3 lightToSurface = normalize(surfacePos - l.position); vec3 lightToSurface = normalize(surfacePos - l.position);
@ -95,7 +101,7 @@ vec3 CalcSpotLight(Light l, vec3 n, vec3 v)
if (diffAttenuation > 0.0) if (diffAttenuation > 0.0)
{ {
vec3 h = normalize(lightDir + v); vec3 h = normalize(lightDir + v);
spec = pow(dot(n, h), 3 + glossiness);
spec = pow(dot(n, h), 3 + glossiness)*s;
} }
return falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb); return falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb);
@ -104,9 +110,10 @@ vec3 CalcSpotLight(Light l, vec3 n, vec3 v)
void main() void main()
{ {
// Calculate fragment normal in screen space // Calculate fragment normal in screen space
// NOTE: important to multiply model matrix by fragment normal to apply model transformation (rotation and scale)
mat3 normalMatrix = transpose(inverse(mat3(modelMatrix))); mat3 normalMatrix = transpose(inverse(mat3(modelMatrix)));
vec3 normal = normalize(normalMatrix*fragNormal); vec3 normal = normalize(normalMatrix*fragNormal);
// Normalize normal and view direction vectors // Normalize normal and view direction vectors
vec3 n = normalize(normal); vec3 n = normalize(normal);
vec3 v = normalize(viewDir); vec3 v = normalize(viewDir);
@ -115,6 +122,17 @@ void main()
vec4 texelColor = texture(texture0, fragTexCoord); vec4 texelColor = texture(texture0, fragTexCoord);
vec3 lighting = colAmbient.rgb; vec3 lighting = colAmbient.rgb;
// Calculate normal texture color fetching or set to maximum normal value by default
if(useNormal == 1)
{
n *= texture(texture1, fragTexCoord).rgb;
n = normalize(n);
}
// Calculate specular texture color fetching or set to maximum specular value by default
float spec = 1.0;
if(useSpecular == 1) spec *= normalize(texture(texture2, fragTexCoord).r);
for (int i = 0; i < lightsCount; i++) for (int i = 0; i < lightsCount; i++)
{ {
// Check if light is enabled // Check if light is enabled
@ -123,14 +141,14 @@ void main()
// Calculate lighting based on light type // Calculate lighting based on light type
switch (lights[i].type) switch (lights[i].type)
{ {
case 0: lighting += CalcPointLight(lights[i], n, v); break;
case 1: lighting += CalcDirectionalLight(lights[i], n, v); break;
case 2: lighting += CalcSpotLight(lights[i], n, v); break;
case 0: lighting += CalcPointLight(lights[i], n, v, spec); break;
case 1: lighting += CalcDirectionalLight(lights[i], n, v, spec); break;
case 2: lighting += CalcSpotLight(lights[i], n, v, spec); break;
default: break; default: break;
} }
} }
} }
// Calculate final fragment color // Calculate final fragment color
finalColor = vec4(texelColor.rgb*lighting, texelColor.a);
finalColor = vec4(texelColor.rgb*lighting*colTint.rgb, texelColor.a*colTint.a);
} }

+ 11
- 6
examples/shaders_standard_lighting.c 查看文件

@ -22,8 +22,8 @@ int main()
{ {
// Initialization // Initialization
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
int screenWidth = 800;
int screenHeight = 450;
int screenWidth = 1280;
int screenHeight = 720;
SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available) SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
@ -36,13 +36,18 @@ int main()
Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model Model dwarf = LoadModel("resources/model/dwarf.obj"); // Load OBJ model
Material material = LoadStandardMaterial(); Material material = LoadStandardMaterial();
material.texDiffuse = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model diffuse texture material.texDiffuse = LoadTexture("resources/model/dwarf_diffuse.png"); // Load model diffuse texture
material.texNormal = LoadTexture("resources/model/dwarf_normal.png"); // Load model normal texture
material.texSpecular = LoadTexture("resources/model/dwarf_specular.png"); // Load model specular texture
material.colDiffuse = (Color){255, 255, 255, 255}; material.colDiffuse = (Color){255, 255, 255, 255};
material.colAmbient = (Color){0, 0, 10, 255}; material.colAmbient = (Color){0, 0, 10, 255};
material.colSpecular = (Color){255, 255, 255, 255}; material.colSpecular = (Color){255, 255, 255, 255};
material.glossiness = 50.0f; material.glossiness = 50.0f;
dwarf.material = material; // Apply material to model dwarf.material = material; // Apply material to model
Model dwarf2 = LoadModel("resources/model/dwarf.obj"); // Load OBJ model
Light spotLight = CreateLight(LIGHT_SPOT, (Vector3){3.0f, 5.0f, 2.0f}, (Color){255, 255, 255, 255}); Light spotLight = CreateLight(LIGHT_SPOT, (Vector3){3.0f, 5.0f, 2.0f}, (Color){255, 255, 255, 255});
spotLight->target = (Vector3){0.0f, 0.0f, 0.0f}; spotLight->target = (Vector3){0.0f, 0.0f, 0.0f};
@ -58,10 +63,10 @@ int main()
Light pointLight = CreateLight(LIGHT_POINT, (Vector3){0.0f, 4.0f, 5.0f}, (Color){255, 255, 255, 255}); Light pointLight = CreateLight(LIGHT_POINT, (Vector3){0.0f, 4.0f, 5.0f}, (Color){255, 255, 255, 255});
pointLight->intensity = 2.0f; pointLight->intensity = 2.0f;
pointLight->diffuse = (Color){100, 100, 255, 255}; pointLight->diffuse = (Color){100, 100, 255, 255};
pointLight->attenuation = 3.0f;
pointLight->radius = 3.0f;
// Setup orbital camera // Setup orbital camera
SetCameraMode(CAMERA_ORBITAL); // Set a orbital camera mode
SetCameraMode(CAMERA_ORBITAL); // Set an orbital camera mode
SetCameraPosition(camera.position); // Set internal camera position to match our camera position SetCameraPosition(camera.position); // Set internal camera position to match our camera position
SetCameraTarget(camera.target); // Set internal camera target to match our camera target SetCameraTarget(camera.target); // Set internal camera target to match our camera target
@ -83,7 +88,7 @@ int main()
ClearBackground(RAYWHITE); ClearBackground(RAYWHITE);
Begin3dMode(camera); Begin3dMode(camera);
DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture DrawModel(dwarf, position, 2.0f, WHITE); // Draw 3d model with texture
DrawLights(); // Draw all created lights in 3D world DrawLights(); // Draw all created lights in 3D world
@ -93,7 +98,7 @@ int main()
End3dMode(); End3dMode();
DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, GRAY); DrawText("(c) Dwarf 3D model by David Moreno", screenWidth - 200, screenHeight - 20, 10, GRAY);
DrawFPS(10, 10); DrawFPS(10, 10);
EndDrawing(); EndDrawing();

+ 21
- 2
src/models.c 查看文件

@ -75,6 +75,25 @@ void Draw3DLine(Vector3 startPos, Vector3 endPos, Color color)
rlEnd(); rlEnd();
} }
// Draw a circle in 3D world space
void Draw3DCircle(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color)
{
rlPushMatrix();
rlTranslatef(center.x, center.y, center.z);
rlRotatef(rotationAngle, rotation.x, rotation.y, rotation.z);
rlBegin(RL_LINES);
for (int i = 0; i < 360; i += 10)
{
rlColor4ub(color.r, color.g, color.b, color.a);
rlVertex3f(sin(DEG2RAD*i)*radius, cos(DEG2RAD*i)*radius, 0.0f);
rlVertex3f(sin(DEG2RAD*(i + 10)) * radius, cos(DEG2RAD*(i + 10)) * radius, 0.0f);
}
rlEnd();
rlPopMatrix();
}
// Draw cube // Draw cube
// NOTE: Cube position is the center position // NOTE: Cube position is the center position
void DrawCube(Vector3 position, float width, float height, float length, Color color) void DrawCube(Vector3 position, float width, float height, float length, Color color)
@ -732,12 +751,12 @@ Material LoadDefaultMaterial(void)
//material.texNormal; // NOTE: By default, not set //material.texNormal; // NOTE: By default, not set
//material.texSpecular; // NOTE: By default, not set //material.texSpecular; // NOTE: By default, not set
material.colTint = WHITE; // Tint color
material.colDiffuse = WHITE; // Diffuse color material.colDiffuse = WHITE; // Diffuse color
material.colAmbient = WHITE; // Ambient color material.colAmbient = WHITE; // Ambient color
material.colSpecular = WHITE; // Specular color material.colSpecular = WHITE; // Specular color
material.glossiness = 100.0f; // Glossiness level material.glossiness = 100.0f; // Glossiness level
material.normalDepth = 1.0f; // Normal map depth
return material; return material;
} }
@ -1250,7 +1269,7 @@ void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rota
//Matrix matModel = MatrixMultiply(model.transform, matTransform); // Transform to world-space coordinates //Matrix matModel = MatrixMultiply(model.transform, matTransform); // Transform to world-space coordinates
model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation); model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation);
o">// model.material.colDiffuse = tint;
model.material.colTint = tint;
rlglDrawMesh(model.mesh, model.material, model.transform); rlglDrawMesh(model.mesh, model.material, model.transform);
} }

+ 3
- 2
src/raylib.h 查看文件

@ -414,12 +414,12 @@ typedef struct Material {
Texture2D texNormal; // Normal texture (binded to shader mapTexture1Loc) Texture2D texNormal; // Normal texture (binded to shader mapTexture1Loc)
Texture2D texSpecular; // Specular texture (binded to shader mapTexture2Loc) Texture2D texSpecular; // Specular texture (binded to shader mapTexture2Loc)
Color colTint; // Tint color
Color colDiffuse; // Diffuse color Color colDiffuse; // Diffuse color
Color colAmbient; // Ambient color Color colAmbient; // Ambient color
Color colSpecular; // Specular color Color colSpecular; // Specular color
float glossiness; // Glossiness level (Ranges from 0 to 1000) float glossiness; // Glossiness level (Ranges from 0 to 1000)
float normalDepth; // Normal map depth
} Material; } Material;
// Model type // Model type
@ -437,7 +437,7 @@ typedef struct LightData {
Vector3 position; Vector3 position;
Vector3 target; // Used on LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target) Vector3 target; // Used on LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target)
float attenuation; // Lost of light intensity with distance (world distance)
float radius; // Lost of light intensity with distance (world distance)
Color diffuse; // Light color Color diffuse; // Light color
float intensity; // Light intensity level float intensity; // Light intensity level
@ -803,6 +803,7 @@ const char *SubText(const char *text, int position, int length);
// Basic 3d Shapes Drawing Functions (Module: models) // Basic 3d Shapes Drawing Functions (Module: models)
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
void Draw3DLine(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space void Draw3DLine(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space
void Draw3DCircle(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color); // Draw a circle in 3D world space
void DrawCube(Vector3 position, float width, float height, float lenght, Color color); // Draw cube void DrawCube(Vector3 position, float width, float height, float lenght, Color color); // Draw cube
void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version)
void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color); // Draw cube wires void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color); // Draw cube wires

+ 21
- 9
src/rlgl.c 查看文件

@ -204,8 +204,8 @@ static bool texCompPVRTSupported = false; // PVR texture compression support
static bool texCompASTCSupported = false; // ASTC texture compression support static bool texCompASTCSupported = false; // ASTC texture compression support
// Lighting data // Lighting data
static Light lights[MAX_LIGHTS]; // Lights pool
static int lightsCount; // Counts current enabled physic objects
static Light lights[MAX_LIGHTS]; // Lights pool
static int lightsCount; // Counts current enabled physic objects
#endif #endif
// Compressed textures support flags // Compressed textures support flags
@ -1793,6 +1793,9 @@ void rlglDrawMesh(Mesh mesh, Material material, Matrix transform)
// Setup shader uniforms for lights // Setup shader uniforms for lights
SetShaderLights(material.shader); SetShaderLights(material.shader);
// Upload to shader material.colSpecular
glUniform4f(glGetUniformLocation(material.shader.id, "colTint"), (float)material.colTint.r/255, (float)material.colTint.g/255, (float)material.colTint.b/255, (float)material.colTint.a/255);
// Upload to shader material.colAmbient // Upload to shader material.colAmbient
glUniform4f(glGetUniformLocation(material.shader.id, "colAmbient"), (float)material.colAmbient.r/255, (float)material.colAmbient.g/255, (float)material.colAmbient.b/255, (float)material.colAmbient.a/255); glUniform4f(glGetUniformLocation(material.shader.id, "colAmbient"), (float)material.colAmbient.r/255, (float)material.colAmbient.g/255, (float)material.colAmbient.b/255, (float)material.colAmbient.a/255);
@ -1810,16 +1813,19 @@ void rlglDrawMesh(Mesh mesh, Material material, Matrix transform)
if ((material.texNormal.id != 0) && (material.shader.mapTexture1Loc != -1)) if ((material.texNormal.id != 0) && (material.shader.mapTexture1Loc != -1))
{ {
// Upload to shader specular map flag
glUniform1i(glGetUniformLocation(material.shader.id, "useNormal"), 1);
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, material.texNormal.id); glBindTexture(GL_TEXTURE_2D, material.texNormal.id);
glUniform1i(material.shader.mapTexture1Loc, 1); // Normal texture fits in active texture unit 1 glUniform1i(material.shader.mapTexture1Loc, 1); // Normal texture fits in active texture unit 1
// TODO: Upload to shader normalDepth
//glUniform1f(???, material.normalDepth);
} }
if ((material.texSpecular.id != 0) && (material.shader.mapTexture2Loc != -1)) if ((material.texSpecular.id != 0) && (material.shader.mapTexture2Loc != -1))
{ {
// Upload to shader specular map flag
glUniform1i(glGetUniformLocation(material.shader.id, "useSpecular"), 1);
glActiveTexture(GL_TEXTURE2); glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, material.texSpecular.id); glBindTexture(GL_TEXTURE_2D, material.texSpecular.id);
glUniform1i(material.shader.mapTexture2Loc, 2); // Specular texture fits in active texture unit 2 glUniform1i(material.shader.mapTexture2Loc, 2); // Specular texture fits in active texture unit 2
@ -2293,7 +2299,13 @@ void DrawLights(void)
{ {
switch (lights[i]->type) switch (lights[i]->type)
{ {
case LIGHT_POINT: DrawSphereWires(lights[i]->position, 0.3f*lights[i]->intensity, 4, 8, (lights[i]->enabled ? lights[i]->diffuse : BLACK)); break;
case LIGHT_POINT:
{
DrawSphereWires(lights[i]->position, 0.3f*lights[i]->intensity, 4, 8, (lights[i]->enabled ? lights[i]->diffuse : BLACK));
Draw3DCircle(lights[i]->position, lights[i]->radius, 0.0f, (Vector3){ 0, 0, 0 }, (lights[i]->enabled ? lights[i]->diffuse : BLACK));
Draw3DCircle(lights[i]->position, lights[i]->radius, 90.0f, (Vector3){ 1, 0, 0 }, (lights[i]->enabled ? lights[i]->diffuse : BLACK));
Draw3DCircle(lights[i]->position, lights[i]->radius, 90.0f, (Vector3){ 0, 1, 0 }, (lights[i]->enabled ? lights[i]->diffuse : BLACK));
} break;
case LIGHT_DIRECTIONAL: case LIGHT_DIRECTIONAL:
{ {
Draw3DLine(lights[i]->position, lights[i]->target, (lights[i]->enabled ? lights[i]->diffuse : BLACK)); Draw3DLine(lights[i]->position, lights[i]->target, (lights[i]->enabled ? lights[i]->diffuse : BLACK));
@ -2553,7 +2565,7 @@ static Shader LoadDefaultShader(void)
// Load standard shader // Load standard shader
// NOTE: This shader supports: // NOTE: This shader supports:
// - Up to 3 different maps: diffuse, normal, specular // - Up to 3 different maps: diffuse, normal, specular
// - Material properties: colAmbient, colDiffuse, colSpecular, glossiness, normalDepth
// - Material properties: colAmbient, colDiffuse, colSpecular, glossiness
// - Up to 8 lights: Point, Directional or Spot // - Up to 8 lights: Point, Directional or Spot
static Shader LoadStandardShader(void) static Shader LoadStandardShader(void)
{ {
@ -3105,9 +3117,9 @@ static void SetShaderLights(Shader shader)
locPoint = GetShaderLocation(shader, locName); locPoint = GetShaderLocation(shader, locName);
glUniform3f(locPoint, lights[i]->position.x, lights[i]->position.y, lights[i]->position.z); glUniform3f(locPoint, lights[i]->position.x, lights[i]->position.y, lights[i]->position.z);
memcpy(&locName[10], "attenuation\0", strlen("attenuation\0"));
memcpy(&locName[10], "radius\0", strlen("radius\0") + 2);
locPoint = GetShaderLocation(shader, locName); locPoint = GetShaderLocation(shader, locName);
glUniform1f(locPoint, lights[i]->attenuation);
glUniform1f(locPoint, lights[i]->radius);
} break; } break;
case LIGHT_DIRECTIONAL: case LIGHT_DIRECTIONAL:
{ {

+ 2
- 2
src/rlgl.h 查看文件

@ -202,12 +202,12 @@ typedef enum { OPENGL_11 = 1, OPENGL_33, OPENGL_ES_20 } GlVersion;
Texture2D texNormal; // Normal texture Texture2D texNormal; // Normal texture
Texture2D texSpecular; // Specular texture Texture2D texSpecular; // Specular texture
Color colTint; // Tint color
Color colDiffuse; // Diffuse color Color colDiffuse; // Diffuse color
Color colAmbient; // Ambient color Color colAmbient; // Ambient color
Color colSpecular; // Specular color Color colSpecular; // Specular color
float glossiness; // Glossiness level (Ranges from 0 to 1000) float glossiness; // Glossiness level (Ranges from 0 to 1000)
float normalDepth; // Normal map depth
} Material; } Material;
// Light type // Light type
@ -218,7 +218,7 @@ typedef enum { OPENGL_11 = 1, OPENGL_33, OPENGL_ES_20 } GlVersion;
Vector3 position; Vector3 position;
Vector3 target; // Used on LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target) Vector3 target; // Used on LIGHT_DIRECTIONAL and LIGHT_SPOT (cone direction target)
float attenuation; // Lost of light intensity with distance (world distance)
float radius; // Lost of light intensity with distance (world distance)
Color diffuse; // Use Vector3 diffuse Color diffuse; // Use Vector3 diffuse
float intensity; float intensity;

正在加载...
取消
保存