Shader refactor
This commit is contained in:
		
							parent
							
								
									e0143f481f
								
							
						
					
					
						commit
						591250b3d5
					
				| @ -43,4 +43,5 @@ Material::Material() { | ||||
|   usesTex = false; | ||||
|   alphaScissor = 0.0f; | ||||
|   unshaded = false; | ||||
|   cullBack = true; | ||||
| } | ||||
|  | ||||
| @ -28,6 +28,7 @@ struct Material { | ||||
|   bool usesTex; | ||||
|   cfloat alphaScissor; | ||||
|   bool unshaded; | ||||
|   bool cullBack; | ||||
|   Material(); | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -35,10 +35,7 @@ void SubMesh::SetupSubMesh() { | ||||
| } | ||||
| 
 | ||||
| void SubMesh::Draw(Shader *shader) { | ||||
|   shader->UpdateColor(material.usesColor, material.color); | ||||
|   shader->UpdateTex(material.usesTex, material.tex); | ||||
|   shader->UpdateAlphaScissor(material.alphaScissor); | ||||
|   shader->UpdateUnshaded(material.unshaded); | ||||
|   shader->UpdateMaterial(material); | ||||
|   glBindVertexArray(VAO); | ||||
|   glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, 0); | ||||
|   glBindVertexArray(0); | ||||
|  | ||||
| @ -4,4 +4,8 @@ | ||||
| 
 | ||||
| ScreenShader::ScreenShader() : Shader(screen_vert, screen_frag) {} | ||||
| 
 | ||||
| void ScreenShader::UpdateTex(Texture tex){ | ||||
|   glBindTexture(GL_TEXTURE_2D, tex.id); | ||||
| } | ||||
| 
 | ||||
| Name ScreenShader::GetName() const {return "Screen Shader";} | ||||
|  | ||||
| @ -4,4 +4,5 @@ class ScreenShader : public Shader { | ||||
| public: | ||||
|   ScreenShader(); | ||||
|   Name GetName() const; | ||||
|   void UpdateTex(Texture texture); | ||||
| }; | ||||
|  | ||||
| @ -53,27 +53,19 @@ void Shader::UpdateProjection(Matrix projection) { | ||||
|   glUniformMatrix4fv(glGetUniformLocation(id, "PROJECTION"), 1, GL_FALSE, glm::value_ptr(projection)); | ||||
| } | ||||
| 
 | ||||
| void Shader::UpdateColor(bool usesColor) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesColor"), (int) usesColor); | ||||
| } | ||||
| 
 | ||||
| void Shader::UpdateColor(bool usesColor, Color color) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesColor"), (int) usesColor); | ||||
|   glUniform3f(glGetUniformLocation(id, "material.color"), color.r, color.g, color.b); | ||||
| } | ||||
| 
 | ||||
| void Shader::UpdateTex(bool usesTex) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) usesTex); | ||||
| } | ||||
| void Shader::UpdateTex(bool usesTex, Texture tex) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) usesTex); | ||||
|   glBindTexture(GL_TEXTURE_2D, tex.id); | ||||
| } | ||||
| void Shader::UpdateAlphaScissor(cfloat alphaScissor) { | ||||
|   glUniform1f(glGetUniformLocation(id, "material.alphaScissor"), alphaScissor); | ||||
| } | ||||
| void Shader::UpdateUnshaded(bool unshaded) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.unshaded"), (int) unshaded); | ||||
| void Shader::UpdateMaterial(Material material) { | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesColor"), (int) material.usesColor); | ||||
|   glUniform3f(glGetUniformLocation(id, "material.color"), | ||||
| 	      material.color.r, | ||||
| 	      material.color.g, | ||||
| 	      material.color.b); | ||||
|   glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) material.usesTex); | ||||
|   if (material.usesTex) { | ||||
|     glBindTexture(GL_TEXTURE_2D, material.tex.id); | ||||
|   } | ||||
|   glUniform1f(glGetUniformLocation(id, "material.alphaScissor"), material.alphaScissor); | ||||
|   glUniform1i(glGetUniformLocation(id, "material.unshaded"), (int) material.unshaded); | ||||
|   glUniform1i(glGetUniformLocation(id, "material.cullBack"), (int) material.cullBack); | ||||
| } | ||||
| 
 | ||||
| void Shader::UpdateDirectionalLight(DirectionalLight directionalLight) { | ||||
|  | ||||
| @ -16,13 +16,9 @@ public: | ||||
|   void UpdateView(Matrix view); | ||||
|   void UpdateModel(Matrix model); | ||||
|   void UpdateProjection(Matrix projection); | ||||
|   void UpdateColor(bool usesColor); | ||||
|   void UpdateColor(bool usesColor, Color color); | ||||
|   void UpdateTex(bool usesTex); | ||||
|   void UpdateTex(bool usesTex, Texture tex); | ||||
|   void UpdateAlphaScissor(cfloat alphaScissor); | ||||
|   void UpdateUnshaded(bool unshaded); | ||||
| 
 | ||||
|   void UpdateMaterial(Material material); | ||||
|    | ||||
|   void UpdateDirectionalLight(DirectionalLight directionalLight); | ||||
| 
 | ||||
|   virtual Name GetName() const; | ||||
|  | ||||
| @ -131,7 +131,7 @@ int main() { | ||||
|     screen.Disable(); | ||||
|     // // Render the screen
 | ||||
|     screenShader->Use(); | ||||
|     screenShader->UpdateTex(true, screen.tex); | ||||
|     screenShader->UpdateTex(screen.tex); | ||||
|     glViewport(0, 0, width, height); | ||||
|     screen.Draw(); | ||||
|      | ||||
|  | ||||
| @ -27,7 +27,7 @@ function init() | ||||
|    camera.transform:Translate(0.0, 0.0, 10.0) | ||||
| 
 | ||||
|    light = couch.DirectionalLight.new() | ||||
|    light.direction = couch.Vector3(0.0, -1.0, 0.0) | ||||
|    light.direction = couch.Vector3(0.0, -1.0, 1.0) | ||||
|    light.color = couch.Vector3(1.0, 1.0, 1.0) | ||||
|    light.ambient = 0.2 | ||||
|    light.diffuse = 1.0 | ||||
| @ -60,6 +60,9 @@ function init() | ||||
|    material = scaffold:GetMaterial(0) | ||||
|    material.alphaScissor = 0.9 | ||||
|    scaffold:SetMaterial(0, material) | ||||
|    material = scaffold:GetMaterial(1) | ||||
|    material.cullBack = false | ||||
|    scaffold:SetMaterial(1, material) | ||||
| 
 | ||||
|    material = scaffold:GetMaterial(1) | ||||
|    material.alphaScissor = 0.1 | ||||
|  | ||||
| @ -16,22 +16,30 @@ struct Material { | ||||
|   bool usesTex; | ||||
|   float alphaScissor; | ||||
|   bool unshaded; | ||||
|   bool cullBack; | ||||
| }; | ||||
| 
 | ||||
| uniform Material material; | ||||
| 
 | ||||
| void main() { | ||||
|   FragColor = vec4(0.0); | ||||
|    | ||||
|   if (material.usesColor) { | ||||
|     FragColor += vec4(material.color, 1.0); | ||||
|   } | ||||
|    | ||||
|   if (material.usesTex) { | ||||
|     FragColor += texture(material.tex, UV); | ||||
|   } | ||||
|    | ||||
|   if (FragColor.w < material.alphaScissor) { | ||||
|     discard; | ||||
|   } | ||||
| 
 | ||||
|   if (material.cullBack && !gl_FrontFacing) { | ||||
|     discard; | ||||
|   } | ||||
| 
 | ||||
|   if (!material.unshaded) { | ||||
|     FragColor *= vec4(AMBIENT + DIFFUSE + SPECULAR, 1.0); | ||||
|   } | ||||
|  | ||||
| @ -4,15 +4,8 @@ in vec2 UV; | ||||
| 
 | ||||
| out vec4 FragColor; | ||||
| 
 | ||||
| struct Material { | ||||
|   vec3 color; | ||||
|   bool usesColor; | ||||
|   sampler2D tex; | ||||
|   bool usesTex; | ||||
| }; | ||||
| 
 | ||||
| uniform Material material; | ||||
| uniform sampler2D tex; | ||||
| 
 | ||||
| void main() { | ||||
|   FragColor = texture(material.tex, UV); | ||||
|   FragColor = texture(tex, UV); | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Dane Johnson
						Dane Johnson