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)); | ||||
| } | ||||
| 
 | ||||
| void Shader::UpdateNormal(glm::mat3 normal) { | ||||
|   glUniformMatrix3fv(glGetUniformLocation(id, "NORMAL"), 1, GL_FALSE, glm::value_ptr(normal)); | ||||
| } | ||||
| 
 | ||||
| void Shader::UpdateMaterial(Material material) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) material.usesTex); | ||||
|   if (material.usesTex) { | ||||
|  | ||||
| @ -16,6 +16,7 @@ public: | ||||
|   void UpdateView(Matrix view); | ||||
|   void UpdateModel(Matrix model); | ||||
|   void UpdateProjection(Matrix projection); | ||||
|   void UpdateNormal(glm::mat3 normal); | ||||
| 
 | ||||
|   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}; | ||||
|   for (int i = 0; i < 6; i++) { | ||||
|     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, | ||||
| 		 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 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::scale(model, spatial->transform.scale); | ||||
|       shader->UpdateModel(model); | ||||
|       shader->UpdateNormal(glm::mat3(glm::transpose(glm::inverse(model)))); | ||||
|     } | ||||
|     Mesh *mesh = dynamic_cast<Mesh*>(curr); | ||||
|     mesh->Draw(shader); | ||||
|  | ||||
| @ -37,12 +37,12 @@ function init() | ||||
|    couch.Node.GetRoot().children:Append(light) | ||||
| 
 | ||||
|    skybox = couch.Skybox.FromFiles( | ||||
|       "skybox/right.jpg", | ||||
|       "skybox/left.jpg", | ||||
|       "skybox/top.jpg", | ||||
|       "skybox/bottom.jpg", | ||||
|       "skybox/front.jpg", | ||||
|       "skybox/back.jpg" | ||||
|       "skybox/px.png", | ||||
|       "skybox/nx.png", | ||||
|       "skybox/py.png", | ||||
|       "skybox/ny.png", | ||||
|       "skybox/pz.png", | ||||
|       "skybox/nz.png" | ||||
|    ) | ||||
|    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. | ||||
| 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!) | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| #version 330 core | ||||
| 
 | ||||
| noperspective in vec2 UV; | ||||
| in vec3 NORMAL; | ||||
| 
 | ||||
| in vec3 AMBIENT; | ||||
| in vec3 DIFFUSE; | ||||
|  | ||||
| @ -7,9 +7,9 @@ layout (location = 2) in vec2 uv; | ||||
| uniform mat4 MODEL; | ||||
| uniform mat4 VIEW; | ||||
| uniform mat4 PROJECTION; | ||||
| uniform mat3 NORMAL; | ||||
| 
 | ||||
| noperspective out vec2 UV; // PSX use affine texture mapping | ||||
| out vec3 NORMAL; | ||||
| 
 | ||||
| out vec3 AMBIENT; | ||||
| out vec3 DIFFUSE; | ||||
| @ -46,18 +46,19 @@ void main() { | ||||
| 
 | ||||
|   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 | ||||
|   AMBIENT = directionalLight.ambient * directionalLight.color * material.ambient; | ||||
| 
 | ||||
|   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); | ||||
|   DIFFUSE = directionalLight.diffuse * diff * directionalLight.color * material.diffuse; | ||||
| 
 | ||||
|   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); | ||||
|   spec = max(spec, 0.0); | ||||
|   spec = pow(spec, material.shininess); | ||||
|  | ||||
 Dane Johnson
						Dane Johnson