Correct for non uniform scale in lighting
@ -53,6 +53,10 @@ void Shader::UpdateProjection(Matrix projection) {
|
|||||||
glUniformMatrix4fv(glGetUniformLocation(id, "PROJECTION"), 1, GL_FALSE, glm::value_ptr(projection));
|
glUniformMatrix4fv(glGetUniformLocation(id, "PROJECTION"), 1, GL_FALSE, glm::value_ptr(projection));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Shader::UpdateNormal(glm::mat3 normal) {
|
||||||
|
glUniformMatrix3fv(glGetUniformLocation(id, "NORMAL"), 1, GL_FALSE, glm::value_ptr(normal));
|
||||||
|
}
|
||||||
|
|
||||||
void Shader::UpdateMaterial(Material material) {
|
void Shader::UpdateMaterial(Material material) {
|
||||||
glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) material.usesTex);
|
glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) material.usesTex);
|
||||||
if (material.usesTex) {
|
if (material.usesTex) {
|
||||||
|
@ -16,6 +16,7 @@ public:
|
|||||||
void UpdateView(Matrix view);
|
void UpdateView(Matrix view);
|
||||||
void UpdateModel(Matrix model);
|
void UpdateModel(Matrix model);
|
||||||
void UpdateProjection(Matrix projection);
|
void UpdateProjection(Matrix projection);
|
||||||
|
void UpdateNormal(glm::mat3 normal);
|
||||||
|
|
||||||
void UpdateMaterial(Material material);
|
void UpdateMaterial(Material material);
|
||||||
|
|
||||||
|
@ -74,6 +74,9 @@ Skybox *Skybox::FromFiles(const char *right, const char* left, const char* top,
|
|||||||
const char* files[] = {right, left, top, bottom, front, back};
|
const char* files[] = {right, left, top, bottom, front, back};
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
data = stbi_load(files[i], &width, &height, &nrChannels, 3);
|
data = stbi_load(files[i], &width, &height, &nrChannels, 3);
|
||||||
|
if (!data) {
|
||||||
|
Util::Die("Could not load skybox image ", files[i]);
|
||||||
|
}
|
||||||
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
|
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
|
||||||
0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
||||||
stbi_image_free(data);
|
stbi_image_free(data);
|
||||||
|
@ -46,6 +46,7 @@ void render(Node *curr, Shader *shader, Matrix model) {
|
|||||||
model = glm::translate(model, spatial->transform.position);
|
model = glm::translate(model, spatial->transform.position);
|
||||||
model = glm::scale(model, spatial->transform.scale);
|
model = glm::scale(model, spatial->transform.scale);
|
||||||
shader->UpdateModel(model);
|
shader->UpdateModel(model);
|
||||||
|
shader->UpdateNormal(glm::mat3(glm::transpose(glm::inverse(model))));
|
||||||
}
|
}
|
||||||
Mesh *mesh = dynamic_cast<Mesh*>(curr);
|
Mesh *mesh = dynamic_cast<Mesh*>(curr);
|
||||||
mesh->Draw(shader);
|
mesh->Draw(shader);
|
||||||
|
@ -37,12 +37,12 @@ function init()
|
|||||||
couch.Node.GetRoot().children:Append(light)
|
couch.Node.GetRoot().children:Append(light)
|
||||||
|
|
||||||
skybox = couch.Skybox.FromFiles(
|
skybox = couch.Skybox.FromFiles(
|
||||||
"skybox/right.jpg",
|
"skybox/px.png",
|
||||||
"skybox/left.jpg",
|
"skybox/nx.png",
|
||||||
"skybox/top.jpg",
|
"skybox/py.png",
|
||||||
"skybox/bottom.jpg",
|
"skybox/ny.png",
|
||||||
"skybox/front.jpg",
|
"skybox/pz.png",
|
||||||
"skybox/back.jpg"
|
"skybox/nz.png"
|
||||||
)
|
)
|
||||||
couch.Node.GetRoot().children:Append(skybox)
|
couch.Node.GetRoot().children:Append(skybox)
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 723 KiB |
Before Width: | Height: | Size: 274 KiB |
Before Width: | Height: | Size: 462 KiB |
Before Width: | Height: | Size: 588 KiB |
BIN
demo/skybox/nx.png
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
demo/skybox/ny.png
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
demo/skybox/nz.png
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
demo/skybox/px.png
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
demo/skybox/py.png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
demo/skybox/pz.png
Normal file
After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 525 KiB |
Before Width: | Height: | Size: 338 KiB |
@ -58,3 +58,4 @@ calling it from the lua file, so stubs aren't necessary to prevent a crash
|
|||||||
I'm a bit happier with the system now, I think it's time I started the lighting.
|
I'm a bit happier with the system now, I think it's time I started the lighting.
|
||||||
We're going to use a pretty basic Phong lighting system, with
|
We're going to use a pretty basic Phong lighting system, with
|
||||||
Flat and Garourd shaders available (This was all that was available on the PSX!)
|
Flat and Garourd shaders available (This was all that was available on the PSX!)
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
noperspective in vec2 UV;
|
noperspective in vec2 UV;
|
||||||
in vec3 NORMAL;
|
|
||||||
|
|
||||||
in vec3 AMBIENT;
|
in vec3 AMBIENT;
|
||||||
in vec3 DIFFUSE;
|
in vec3 DIFFUSE;
|
||||||
|
@ -7,9 +7,9 @@ layout (location = 2) in vec2 uv;
|
|||||||
uniform mat4 MODEL;
|
uniform mat4 MODEL;
|
||||||
uniform mat4 VIEW;
|
uniform mat4 VIEW;
|
||||||
uniform mat4 PROJECTION;
|
uniform mat4 PROJECTION;
|
||||||
|
uniform mat3 NORMAL;
|
||||||
|
|
||||||
noperspective out vec2 UV; // PSX use affine texture mapping
|
noperspective out vec2 UV; // PSX use affine texture mapping
|
||||||
out vec3 NORMAL;
|
|
||||||
|
|
||||||
out vec3 AMBIENT;
|
out vec3 AMBIENT;
|
||||||
out vec3 DIFFUSE;
|
out vec3 DIFFUSE;
|
||||||
@ -46,18 +46,19 @@ void main() {
|
|||||||
|
|
||||||
UV = uv;
|
UV = uv;
|
||||||
|
|
||||||
NORMAL = (VIEW * MODEL * vec4(normal, 0.0)).xyz;
|
vec3 my_normal = (VIEW * MODEL * vec4(normal, 0.0)).xyz;
|
||||||
|
my_normal *= NORMAL;
|
||||||
|
|
||||||
// Flat shading, we compute light per vertex
|
// Flat shading, we compute light per vertex
|
||||||
AMBIENT = directionalLight.ambient * directionalLight.color * material.ambient;
|
AMBIENT = directionalLight.ambient * directionalLight.color * material.ambient;
|
||||||
|
|
||||||
vec3 direction = -(VIEW * vec4(directionalLight.direction, 0.0)).xyz;
|
vec3 direction = -(VIEW * vec4(directionalLight.direction, 0.0)).xyz;
|
||||||
float diff = dot(normalize(direction), normalize(NORMAL));
|
float diff = dot(normalize(direction), normalize(my_normal));
|
||||||
diff = max(diff, 0.0);
|
diff = max(diff, 0.0);
|
||||||
DIFFUSE = directionalLight.diffuse * diff * directionalLight.color * material.diffuse;
|
DIFFUSE = directionalLight.diffuse * diff * directionalLight.color * material.diffuse;
|
||||||
|
|
||||||
vec3 viewDir = normalize((VIEW * MODEL * vec4(pos, 1.0)).xyz);
|
vec3 viewDir = normalize((VIEW * MODEL * vec4(pos, 1.0)).xyz);
|
||||||
vec3 reflectionDir = reflect(normalize(direction), normalize(NORMAL));
|
vec3 reflectionDir = reflect(normalize(direction), normalize(my_normal));
|
||||||
float spec = dot(viewDir, reflectionDir);
|
float spec = dot(viewDir, reflectionDir);
|
||||||
spec = max(spec, 0.0);
|
spec = max(spec, 0.0);
|
||||||
spec = pow(spec, material.shininess);
|
spec = pow(spec, material.shininess);
|
||||||
|