Browse Source

Phong shader: simplified uniforms, added default values.

pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
c91ecbef1e
  1. 4
      src/Shaders/PhongShader.cpp
  2. 17
      src/Shaders/PhongShader.frag
  3. 45
      src/Shaders/PhongShader.h

4
src/Shaders/PhongShader.cpp

@ -38,9 +38,7 @@ PhongShader::PhongShader() {
transformationMatrixUniform = uniformLocation("transformationMatrix"); transformationMatrixUniform = uniformLocation("transformationMatrix");
projectionMatrixUniform = uniformLocation("projectionMatrix"); projectionMatrixUniform = uniformLocation("projectionMatrix");
lightUniform = uniformLocation("light"); lightUniform = uniformLocation("light");
lightAmbientColorUniform = uniformLocation("lightAmbientColor"); lightColorUniform = uniformLocation("lightColor");
lightDiffuseColorUniform = uniformLocation("lightDiffuseColor");
lightSpecularColorUniform = uniformLocation("lightSpecularColor");
} }
}} }}

17
src/Shaders/PhongShader.frag

@ -1,13 +1,10 @@
#version 330 #version 330
uniform vec3 ambientColor; uniform vec3 ambientColor = vec3(0.0, 0.0, 0.0);
uniform vec3 diffuseColor; uniform vec3 diffuseColor;
uniform vec3 specularColor; uniform vec3 specularColor = vec3(1.0, 1.0, 1.0);
uniform float shininess; uniform vec3 lightColor = vec3(1.0, 1.0, 1.0);
uniform float shininess = 80.0;
uniform vec3 lightAmbientColor;
uniform vec3 lightDiffuseColor;
uniform vec3 lightSpecularColor;
in vec3 transformedNormal; in vec3 transformedNormal;
in vec3 lightDirection; in vec3 lightDirection;
@ -16,20 +13,20 @@ out vec4 color;
void main() { void main() {
/* Ambient color */ /* Ambient color */
color.rgb = ambientColor*lightAmbientColor; color.rgb = ambientColor;
vec3 normalizedTransformedNormal = normalize(transformedNormal); vec3 normalizedTransformedNormal = normalize(transformedNormal);
vec3 normalizedLightDirection = normalize(lightDirection); vec3 normalizedLightDirection = normalize(lightDirection);
/* Add diffuse color */ /* Add diffuse color */
float intensity = max(0.0, dot(normalizedTransformedNormal, normalizedLightDirection)); float intensity = max(0.0, dot(normalizedTransformedNormal, normalizedLightDirection));
color.rgb += diffuseColor*lightDiffuseColor*intensity; color.rgb += diffuseColor*lightColor*intensity;
/* Add specular color, if needed */ /* Add specular color, if needed */
if(intensity != 0) { if(intensity != 0) {
vec3 reflection = reflect(-normalizedLightDirection, normalizedTransformedNormal); vec3 reflection = reflect(-normalizedLightDirection, normalizedTransformedNormal);
float specularity = pow(max(0.0, dot(normalizedTransformedNormal, reflection)), shininess); float specularity = pow(max(0.0, dot(normalizedTransformedNormal, reflection)), shininess);
color.rgb += specularColor*lightSpecularColor*specularity; color.rgb += specularColor*specularity;
} }
/* Force alpha to 1 */ /* Force alpha to 1 */

45
src/Shaders/PhongShader.h

@ -37,22 +37,35 @@ class PhongShader: public AbstractShaderProgram {
/** @brief Constructor */ /** @brief Constructor */
PhongShader(); PhongShader();
/** @brief %Object ambient color */ /**
* @brief %Ambient color
*
* If not set, default value is `(0.0f, 0.0f, 0.0f)`.
*/
inline void setAmbientColorUniform(const Vector3& color) { inline void setAmbientColorUniform(const Vector3& color) {
setUniform(ambientColorUniform, color); setUniform(ambientColorUniform, color);
} }
/** @brief %Object diffuse color */ /** @brief Diffuse color */
inline void setDiffuseColorUniform(const Vector3& color) { inline void setDiffuseColorUniform(const Vector3& color) {
setUniform(diffuseColorUniform, color); setUniform(diffuseColorUniform, color);
} }
/** @brief %Object specular color */ /**
* @brief Specular color
*
* If not set, default value is `(1.0f, 1.0f, 1.0f)`.
*/
inline void setSpecularColorUniform(const Vector3& color) { inline void setSpecularColorUniform(const Vector3& color) {
setUniform(specularColorUniform, color); setUniform(specularColorUniform, color);
} }
/** @brief %Object shininess */ /**
* @brief Shininess
*
* The larger value, the harder surface (smaller specular highlight).
* If not set, default value is `80.0f`.
*/
inline void setShininessUniform(GLfloat shininess) { inline void setShininessUniform(GLfloat shininess) {
setUniform(shininessUniform, shininess); setUniform(shininessUniform, shininess);
} }
@ -72,19 +85,13 @@ class PhongShader: public AbstractShaderProgram {
setUniform(lightUniform, light); setUniform(lightUniform, light);
} }
/** @brief %Light ambient color */ /**
inline void setLightAmbientColorUniform(const Vector3& color) { * @brief %Light color
setUniform(lightAmbientColorUniform, color); *
} * If not set, default value is `(1.0f, 1.0f, 1.0f)`.
*/
/** @brief %Light diffuse color */ inline void setLightColorUniform(const Vector3& color) {
inline void setLightDiffuseColorUniform(const Vector3& color) { setUniform(lightColorUniform, color);
setUniform(lightDiffuseColorUniform, color);
}
/** @brief %Light specular color */
inline void setLightSpecularColorUniform(const Vector3& color) {
setUniform(lightSpecularColorUniform, color);
} }
private: private:
@ -95,9 +102,7 @@ class PhongShader: public AbstractShaderProgram {
transformationMatrixUniform, transformationMatrixUniform,
projectionMatrixUniform, projectionMatrixUniform,
lightUniform, lightUniform,
lightAmbientColorUniform, lightColorUniform;
lightDiffuseColorUniform,
lightSpecularColorUniform;
}; };
}} }}

Loading…
Cancel
Save