浏览代码

add specColor

bstouls 10 年之前
父节点
当前提交
d62d555e11
共有 5 个文件被更改,包括 23 次插入9 次删除
  1. 9 0
      h3d/mat/MeshMaterial.hx
  2. 5 2
      h3d/scene/DirLight.hx
  3. 5 3
      h3d/shader/BaseMesh.hx
  4. 2 2
      h3d/shader/DirLight.hx
  5. 2 2
      h3d/shader/SpecularTexture.hx

+ 9 - 0
h3d/mat/MeshMaterial.hx

@@ -9,6 +9,7 @@ class MeshMaterial extends Material {
 	public var specularTexture(get,set) : h3d.mat.Texture;
 
 	public var color(get, set) : Vector;
+	public var specularAmount(get, set) : Float;
 	public var specularPower(get, set) : Float;
 	public var blendMode(default, set) : BlendMode;
 
@@ -27,6 +28,14 @@ class MeshMaterial extends Material {
 		return mshader.specularPower = v;
 	}
 
+	inline function get_specularAmount() {
+		return mshader.specularAmount;
+	}
+
+	inline function set_specularAmount(v) {
+		return mshader.specularAmount = v;
+	}
+
 	inline function get_color() {
 		return mshader.color;
 	}

+ 5 - 2
h3d/scene/DirLight.hx

@@ -16,9 +16,12 @@ class DirLight extends Light {
 		return dshader.color;
 	}
 
+	override function get_enableSpecular() {
+		return dshader.enableSpecular;
+	}
+
 	override function set_enableSpecular(b) {
-		dshader.enableSpecular = b;
-		return false;
+		return dshader.enableSpecular = b;
 	}
 
 	override function emit(ctx) {

+ 5 - 3
h3d/shader/BaseMesh.hx

@@ -42,11 +42,12 @@ class BaseMesh extends hxsl.Shader {
 		var depth : Float;
 		var screenUV : Vec2;
 		var specPower : Float;
-		var specAmount : Float;
+		var specColor : Vec3;
 
 		@param var color : Vec4;
 		@param var specularPower : Float;
 		@param var specularAmount : Float;
+		@param var specularColor : Vec3;
 
 		// each __init__ expr is out of order dependency-based
 		function __init__() {
@@ -59,13 +60,13 @@ class BaseMesh extends hxsl.Shader {
 			depth = projectedPosition.z / projectedPosition.w;
 			screenUV = (projectedPosition.xy / projectedPosition.w) * vec2(0.5, -0.5) + 0.5;
 			specPower = specularPower;
-			specAmount = specularAmount;
+			specColor = specularColor * specularAmount;
 		}
 
 		function __init__fragment() {
 			transformedNormal = transformedNormal.normalize();
 			specPower = specularPower;
-			specAmount = specularAmount;
+			specColor = specularColor * specularAmount;
 		}
 
 		function vertex() {
@@ -84,6 +85,7 @@ class BaseMesh extends hxsl.Shader {
 	public function new() {
 		super();
 		color.set(1, 1, 1);
+		specularColor.set(1, 1, 1);
 		specularPower = 50;
 		specularAmount = 1;
 	}

+ 2 - 2
h3d/shader/DirLight.hx

@@ -14,8 +14,8 @@ class DirLight extends hxsl.Shader {
 		var lightPixelColor : Vec3;
 		var transformedNormal : Vec3;
 		var transformedPosition : Vec3;
-		var specAmount : Float;
 		var specPower : Float;
+		var specColor : Vec3;
 
 		function calcLighting() : Vec3 {
 			var diff = transformedNormal.dot(-direction).max(0.);
@@ -23,7 +23,7 @@ class DirLight extends hxsl.Shader {
 				return color * diff;
 			var r = reflect(direction, transformedNormal).normalize();
 			var specValue = r.dot((camera.position - transformedPosition).normalize()).max(0.);
-			return color * (diff + specAmount * pow(specValue, specPower));
+			return color * (diff + specColor * pow(specValue, specPower));
 		}
 
 		function vertex() {

+ 2 - 2
h3d/shader/SpecularTexture.hx

@@ -5,10 +5,10 @@ class SpecularTexture extends hxsl.Shader {
 	static var SRC = {
 		@param var texture : Sampler2D;
 		var calculatedUV : Vec2;
-		var specAmount : Float;
+		var specColor : Vec3;
 
 		function fragment() {
-			specAmount *= texture.get(calculatedUV).x;
+			specColor *= texture.get(calculatedUV).rgb;
 		}
 	}