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); | ||||||
|  | |||||||
 Dane Johnson
						Dane Johnson