summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chickadee/render/phong.scm40
1 files changed, 29 insertions, 11 deletions
diff --git a/chickadee/render/phong.scm b/chickadee/render/phong.scm
index 2341e7a..cb649de 100644
--- a/chickadee/render/phong.scm
+++ b/chickadee/render/phong.scm
@@ -32,6 +32,8 @@
phong-material?
phong-material-name
phong-material-ambient
+ phong-material-ambient-map
+ phong-material-use-ambient-map?
phong-material-diffuse
phong-material-diffuse-map
phong-material-use-diffuse-map?
@@ -55,6 +57,8 @@
phong-material?
(local-field name phong-material-name)
(float-vec3 ambient phong-material-ambient)
+ (local-field ambient-map phong-material-ambient-map)
+ (bool use-ambient-map phong-material-use-ambient-map?)
(float-vec3 diffuse phong-material-diffuse)
(local-field diffuse-map phong-material-diffuse-map)
(bool use-diffuse-map phong-material-use-diffuse-map?)
@@ -68,6 +72,8 @@
(define default-phong-material
(make-phong-material #:name "default"
#:ambient (vec3 0.5 0.5 0.5)
+ #:ambient-map null-texture
+ #:use-ambient-map #f
#:diffuse (vec3 0.8 0.8 0.8)
#:diffuse-map null-texture
#:use-diffuse-map #f
@@ -133,6 +139,8 @@ void main() {
struct Material {
vec3 ambient;
+ sampler2D ambientMap;
+ bool useAmbientMap;
vec3 diffuse;
sampler2D diffuseMap;
bool useDiffuseMap;
@@ -158,10 +166,19 @@ uniform Material material;
uniform DirectionalLight directionalLight;
void main() {
+ vec3 baseAmbientColor;
vec3 baseDiffuseColor;
vec3 baseSpecularColor;
+ if(material.useAmbientMap) {
+ baseAmbientColor = texture2D(material.ambientMap, fragTex).xyz;
+ } else {
+ baseAmbientColor = vec3(1.0, 1.0, 1.0);
+ }
if(material.useDiffuseMap) {
- baseDiffuseColor = texture2D(material.diffuseMap, fragTex).xyz;
+ // discard transparent fragments.
+ vec4 color = texture2D(material.diffuseMap, fragTex);
+ if(color.a == 0.0) { discard; }
+ baseDiffuseColor = color.xyz;
} else {
baseDiffuseColor = vec3(1.0, 1.0, 1.0);
}
@@ -170,7 +187,7 @@ void main() {
} else {
baseSpecularColor = vec3(1.0, 1.0, 1.0);
}
- vec3 ambientColor = material.ambient * baseDiffuseColor;
+ vec3 ambientColor = material.ambient * baseAmbientColor * baseDiffuseColor;
vec3 lightDir = normalize(-directionalLight.direction);
float diffuseFactor = max(dot(lightDir, fragNorm), 0.0);
vec3 diffuseColor = diffuseFactor * baseDiffuseColor * material.diffuse;
@@ -185,12 +202,13 @@ void main() {
(force phong-shader))
(define (gpu-apply/phong shader vertex-array material model-matrix view-matrix)
- (with-texture 0 (phong-material-diffuse-map material)
- (with-texture 1 (phong-material-specular-map material)
- (with-texture 2 (phong-material-bump-map material)
- (gpu-apply shader vertex-array
- #:model model-matrix
- #:view view-matrix
- #:projection (current-projection)
- #:material material
- #:directional-light default-directional-light)))))
+ (with-texture 0 (phong-material-ambient-map material)
+ (with-texture 1 (phong-material-diffuse-map material)
+ (with-texture 2 (phong-material-specular-map material)
+ (with-texture 3 (phong-material-bump-map material)
+ (gpu-apply shader vertex-array
+ #:model model-matrix
+ #:view view-matrix
+ #:projection (current-projection)
+ #:material material
+ #:directional-light default-directional-light))))))