1 // #import "MatDefs/pmd/Skinning.glsllib"
\r
2 uniform mat4 m_BoneMatrices[20];
\r
4 // #define HQ_ATTENUATION
\r
6 uniform mat4 g_WorldViewProjectionMatrix;
\r
7 uniform mat4 g_WorldViewMatrix;
\r
8 uniform mat3 g_NormalMatrix;
\r
9 uniform mat4 g_ViewMatrix;
\r
11 uniform vec4 m_Ambient;
\r
12 uniform vec4 m_Diffuse;
\r
13 uniform vec4 m_Specular;
\r
14 uniform float m_Shininess;
\r
16 uniform vec4 g_LightColor;
\r
17 uniform vec4 g_LightPosition;
\r
18 uniform vec4 g_AmbientLightColor;
\r
20 varying vec2 texCoord;
\r
22 varying vec4 AmbientSum;
\r
23 varying vec4 DiffuseSum;
\r
24 varying vec4 SpecularSum;
\r
26 attribute vec3 inPosition;
\r
27 attribute vec2 inTexCoord;
\r
28 attribute vec3 inNormal;
\r
30 // uniform Sampler2D m_BoneParameter;
\r
31 // uniform sampler2D m_BoneParameter;
\r
33 #ifdef HQ_ATTENUATION
\r
34 varying vec3 lightVec;
\r
38 attribute vec4 inColor;
\r
41 #ifndef VERTEX_LIGHTING
\r
42 attribute vec4 inTangent;
\r
45 varying vec3 vNormal;
\r
47 varying vec3 vPosition;
\r
48 varying vec3 vViewDir;
\r
49 varying vec4 vLightDir;
\r
52 #ifdef USE_REFLECTION
\r
53 uniform vec3 g_CameraPosition;
\r
54 uniform mat4 g_WorldMatrix;
\r
56 uniform vec3 m_FresnelParams;
\r
57 varying vec4 refVec;
\r
62 * attribute inPosition
\r
63 * attribute inNormal
\r
64 * uniform g_WorldMatrix
\r
65 * uniform g_CameraPosition
\r
70 void computeRef(in vec4 position, in vec4 normal){
\r
71 vec3 worldPos = (g_WorldMatrix * vec4(position.xyz,1.0)).xyz;
\r
73 vec3 I = normalize( g_CameraPosition - worldPos ).xyz;
\r
74 vec3 N = normalize( (g_WorldMatrix * vec4(normal.xyz, 0.0)).xyz );
\r
76 refVec.xyz = reflect(I, N);
\r
77 refVec.w = m_FresnelParams.x + m_FresnelParams.y * pow(1.0 + dot(I, N), m_FresnelParams.z);
\r
81 // JME3 lights in world space
\r
82 void lightComputeDir(in vec3 worldPos, in vec4 color, in vec4 position, out vec4 lightDir){
\r
83 float posLight = step(0.5, color.w);
\r
84 vec3 tempVec = position.xyz * sign(posLight - 0.5) - (worldPos * posLight);
\r
86 float dist = length(tempVec);
\r
87 lightDir.w = clamp(1.0 - position.w * dist * posLight, 0.0, 1.0);
\r
88 lightDir.xyz = tempVec / vec3(dist);
\r
89 #ifdef HQ_ATTENUATION
\r
93 lightDir = vec4(normalize(tempVec), 1.0);
\r
97 #ifdef VERTEX_LIGHTING
\r
98 float lightComputeDiffuse(in vec3 norm, in vec3 lightdir){
\r
99 return max(0.0, dot(norm, lightdir));
\r
102 float lightComputeSpecular(in vec3 norm, in vec3 viewdir, in vec3 lightdir, in float shiny){
\r
103 #ifndef LOW_QUALITY
\r
104 vec3 H = (viewdir + lightdir) * vec3(0.5);
\r
105 return pow(max(dot(H, norm), 0.0), shiny);
\r
111 vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec4 wvLightPos){
\r
113 lightComputeDir(wvPos, g_LightColor, wvLightPos, lightDir);
\r
115 float diffuseFactor = lightComputeDiffuse(wvNorm, lightDir.xyz);
\r
116 float specularFactor = lightComputeSpecular(wvNorm, wvViewDir, lightDir.xyz, m_Shininess);
\r
117 //specularFactor *= step(0.01, diffuseFactor);
\r
118 return vec2(diffuseFactor, specularFactor) * vec2(lightDir.w);
\r
121 attribute vec4 inBoneWeight;
\r
122 attribute vec4 inBoneIndices;
\r
123 attribute vec4 inBoneIndex;
\r
125 void Skinning_Compute(inout vec4 position, inout vec4 normal){
\r
126 // vec4 index = inBoneIndices;
\r
127 vec4 index = inBoneIndex;
\r
128 vec4 weight = inBoneWeight;
\r
130 vec4 newPos = vec4(0.0);
\r
131 vec4 newNormal = vec4(0.0);
\r
133 for (float i = 0.0; i < 2.0; i += 1.0){
\r
134 mat4 skinMat = m_BoneMatrices[int(index.x)];
\r
135 newPos += weight.x * (skinMat * position);
\r
136 newNormal += weight.x * (skinMat * normal);
\r
137 index = index.yzwx;
\r
138 weight = weight.yzwx;
\r
142 normal = newNormal;
\r
146 vec4 pos = vec4(inPosition, 1.0);
\r
147 vec4 normal = vec4(inNormal,0.0);
\r
148 Skinning_Compute(pos, normal);
\r
149 // pos = m_BoneMatrices[0] * pos;
\r
150 gl_Position = g_WorldViewProjectionMatrix * pos;
\r
151 texCoord = inTexCoord;
\r
153 vec3 wvPosition = (g_WorldViewMatrix * pos).xyz;
\r
154 vec3 wvNormal = normalize(g_NormalMatrix * normal.xyz);
\r
156 // vec3 wvPosition = (g_WorldViewMatrix * pos).xyz;
\r
157 // vec3 wvNormal = normalize(g_NormalMatrix * inNormal);
\r
159 vec3 viewDir = normalize(-wvPosition);
\r
161 //vec4 lightColor = g_LightColor[gl_InstanceID];
\r
162 //vec4 lightPos = g_LightPosition[gl_InstanceID];
\r
163 //vec4 wvLightPos = (g_ViewMatrix * vec4(lightPos.xyz, lightColor.w));
\r
164 //wvLightPos.w = lightPos.w;
\r
166 vec4 wvLightPos = (g_ViewMatrix * vec4(g_LightPosition.xyz, g_LightColor.w));
\r
167 wvLightPos.w = g_LightPosition.w;
\r
168 vec4 lightColor = g_LightColor;
\r
170 #if defined(NORMALMAP) && !defined(VERTEX_LIGHTING)
\r
171 vec3 wvTangent = normalize(g_NormalMatrix * inTangent.xyz);
\r
172 vec3 wvBinormal = cross(wvNormal, wvTangent);
\r
174 mat3 tbnMat = mat3(wvTangent, wvBinormal * -inTangent.w,wvNormal);
\r
176 vPosition = wvPosition * tbnMat;
\r
177 vViewDir = viewDir * tbnMat;
\r
178 lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir);
\r
179 vLightDir.xyz = (vLightDir.xyz * tbnMat).xyz;
\r
180 #elif !defined(VERTEX_LIGHTING)
\r
181 vNormal = wvNormal;
\r
183 vPosition = wvPosition;
\r
184 vViewDir = viewDir;
\r
186 lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir);
\r
189 vNormal = normalize(g_NormalMatrix * inTangent.xyz);
\r
190 vNormal = -cross(cross(vLightDir.xyz, vNormal), vNormal);
\r
194 lightColor.w = 1.0;
\r
195 #ifdef MATERIAL_COLORS
\r
196 AmbientSum = m_Ambient * g_AmbientLightColor;
\r
197 DiffuseSum = m_Diffuse * lightColor;
\r
198 SpecularSum = m_Specular * lightColor;
\r
200 AmbientSum = vec4(0.2, 0.2, 0.2, 1.0) * g_AmbientLightColor; // Default: ambient color is dark gray
\r
201 DiffuseSum = lightColor;
\r
202 SpecularSum = lightColor;
\r
205 #ifdef VERTEX_COLOR
\r
206 AmbientSum *= inColor;
\r
207 DiffuseSum *= inColor;
\r
210 #ifdef VERTEX_LIGHTING
\r
211 vec2 light = computeLighting(wvPosition, wvNormal, viewDir, wvLightPos);
\r
213 AmbientSum.a = light.x;
\r
214 SpecularSum.a = light.y;
\r
217 #ifdef USE_REFLECTION
\r
218 computeRef(pos,normal);
\r