OSDN Git Service

init
[mikumikustudio/MikuMikuStudio.git] / src / MatDefs / pmd / pmd.vert
1 // #import "MatDefs/pmd/Skinning.glsllib"\r
2 uniform mat4 m_BoneMatrices[20];\r
3 #define ATTENUATION\r
4 // #define HQ_ATTENUATION\r
5 \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
10 \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
15 \r
16 uniform vec4 g_LightColor;\r
17 uniform vec4 g_LightPosition;\r
18 uniform vec4 g_AmbientLightColor;\r
19 \r
20 varying vec2 texCoord;\r
21 \r
22 varying vec4 AmbientSum;\r
23 varying vec4 DiffuseSum;\r
24 varying vec4 SpecularSum;\r
25 \r
26 attribute vec3 inPosition;\r
27 attribute vec2 inTexCoord;\r
28 attribute vec3 inNormal;\r
29 \r
30 // uniform Sampler2D m_BoneParameter;\r
31 // uniform sampler2D m_BoneParameter;\r
32 \r
33 #ifdef HQ_ATTENUATION\r
34   varying vec3 lightVec;\r
35 #endif\r
36 \r
37 #ifdef VERTEX_COLOR\r
38   attribute vec4 inColor;\r
39 #endif\r
40 \r
41 #ifndef VERTEX_LIGHTING\r
42   attribute vec4 inTangent;\r
43 \r
44   #ifndef NORMALMAP\r
45     varying vec3 vNormal;\r
46   #endif\r
47   varying vec3 vPosition;\r
48   varying vec3 vViewDir;\r
49   varying vec4 vLightDir;\r
50 #endif\r
51 \r
52 #ifdef USE_REFLECTION\r
53     uniform vec3 g_CameraPosition;\r
54     uniform mat4 g_WorldMatrix;\r
55 \r
56     uniform vec3 m_FresnelParams;\r
57     varying vec4 refVec;\r
58 \r
59 \r
60     /**\r
61      * Input:\r
62      * attribute inPosition\r
63      * attribute inNormal\r
64      * uniform g_WorldMatrix\r
65      * uniform g_CameraPosition\r
66      *\r
67      * Output:\r
68      * varying refVec\r
69      */\r
70     void computeRef(in vec4 position, in vec4 normal){\r
71         vec3 worldPos = (g_WorldMatrix * vec4(position.xyz,1.0)).xyz;\r
72 \r
73         vec3 I = normalize( g_CameraPosition - worldPos  ).xyz;\r
74         vec3 N = normalize( (g_WorldMatrix * vec4(normal.xyz, 0.0)).xyz );\r
75 \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
78     }\r
79 #endif\r
80 \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
85     #ifdef ATTENUATION\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
90        lightVec = tempVec;\r
91      #endif\r
92     #else\r
93      lightDir = vec4(normalize(tempVec), 1.0);\r
94     #endif\r
95 }\r
96 \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
100   }\r
101 \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
106       #else\r
107         return 0.0;\r
108       #endif\r
109   }\r
110 \r
111 vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec4 wvLightPos){\r
112      vec4 lightDir;\r
113      lightComputeDir(wvPos, g_LightColor, wvLightPos, lightDir);\r
114 \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
119   }\r
120 #endif\r
121 attribute vec4 inBoneWeight;\r
122 attribute vec4 inBoneIndices;\r
123 attribute vec4 inBoneIndex;\r
124 \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
129 \r
130     vec4 newPos    = vec4(0.0);\r
131     vec4 newNormal = vec4(0.0);\r
132 \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
139     }\r
140 \r
141     position = newPos;\r
142     normal = newNormal;\r
143 }\r
144 \r
145 void main(){\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
152 \r
153    vec3 wvPosition = (g_WorldViewMatrix * pos).xyz;\r
154    vec3 wvNormal  = normalize(g_NormalMatrix * normal.xyz);\r
155 \r
156 //   vec3 wvPosition = (g_WorldViewMatrix * pos).xyz;\r
157 //   vec3 wvNormal  = normalize(g_NormalMatrix * inNormal);\r
158 \r
159    vec3 viewDir = normalize(-wvPosition);\r
160 \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
165 \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
169 \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
173 \r
174      mat3 tbnMat = mat3(wvTangent, wvBinormal * -inTangent.w,wvNormal);\r
175      \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
182 \r
183      vPosition = wvPosition;\r
184      vViewDir = viewDir;\r
185 \r
186      lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir);\r
187 \r
188      #ifdef V_TANGENT\r
189         vNormal = normalize(g_NormalMatrix * inTangent.xyz);\r
190         vNormal = -cross(cross(vLightDir.xyz, vNormal), vNormal);\r
191      #endif\r
192    #endif\r
193 \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
199     #else\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
203     #endif\r
204 \r
205     #ifdef VERTEX_COLOR\r
206       AmbientSum *= inColor;\r
207       DiffuseSum *= inColor;\r
208     #endif\r
209 \r
210     #ifdef VERTEX_LIGHTING\r
211        vec2 light = computeLighting(wvPosition, wvNormal, viewDir, wvLightPos);\r
212 \r
213        AmbientSum.a  = light.x;\r
214        SpecularSum.a = light.y;\r
215     #endif\r
216 \r
217     #ifdef USE_REFLECTION\r
218         computeRef(pos,normal);\r
219     #endif \r
220 }\r