diff options
Diffstat (limited to 'shaders/tesseract/321.shader_test')
-rw-r--r-- | shaders/tesseract/321.shader_test | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/shaders/tesseract/321.shader_test b/shaders/tesseract/321.shader_test new file mode 100644 index 0000000..ec6dcb1 --- /dev/null +++ b/shaders/tesseract/321.shader_test @@ -0,0 +1,176 @@ +[require] +GLSL >= 1.10 + +[vertex shader] +#version 120 +#extension GL_ARB_texture_rectangle : enable +#define flat +#define texture2DRectOffset(sampler, coords, offset) texture2DRect(sampler, coords + vec2(offset)) +#define shadow2DRectOffset(sampler, coords, offset) shadow2DRect(sampler, coords + vec2(offset)) +attribute vec4 vvertex, vtangent; + attribute vec2 vtexcoord0; + + attribute vec4 vboneweight, vboneindex; + #pragma CUBE2_uniform animdata + uniform vec4 animdata[192]; + + uniform mat4 modelmatrix; + uniform mat3 modelworld; + uniform vec3 modelcamera; + uniform vec2 texscroll; + + varying mat3 world; + + + varying vec3 camvec; + + + varying vec2 texcoord0; + + void main(void) + { + + int index = int(vboneindex.x); + + vec4 dqreal = animdata[index] * vboneweight.x; + vec4 dqdual = animdata[index+1] * vboneweight.x; + index = int(vboneindex.y); + dqreal += animdata[index] * vboneweight.y; + dqdual += animdata[index+1] * vboneweight.y; + + + float len = length(dqreal); + dqreal /= len; + dqdual /= len; + + + vec4 mpos = vec4((cross(dqreal.xyz, cross(dqreal.xyz, vvertex.xyz) + vvertex.xyz*dqreal.w + dqdual.xyz) + dqdual.xyz*dqreal.w - dqreal.xyz*dqdual.w)*2.0 + vvertex.xyz, vvertex.w); + + + vec4 mquat = vec4(cross(dqreal.xyz, vtangent.xyz) + dqreal.xyz*vtangent.w + vtangent.xyz*dqreal.w, dqreal.w*vtangent.w - dot(dqreal.xyz, vtangent.xyz)); + + vec4 qxyz = mquat.xxyy*mquat.yzyz, qxzw = vec4(mquat.xzw, -mquat.w); + vec3 mtangent = (qxzw.yzw*mquat.zzy + qxyz.zxy)*vec3(-2.0, 2.0, 2.0) + vec3(1.0, 0.0, 0.0); + vec3 mnormal = (qxzw.zwx*mquat.yxx + qxyz.ywz)*vec3(2.0, 2.0, -2.0) + vec3(0.0, 0.0, 1.0); + + + + + + + gl_Position = modelmatrix * mpos; + + texcoord0 = vtexcoord0 + texscroll; + + + + + camvec = modelworld * normalize(modelcamera - mpos.xyz); + + + + + + vec3 wnormal = modelworld * mnormal; + vec3 wtangent = modelworld * mtangent; + vec3 wbitangent = cross(wnormal, wtangent) * (vtangent.w < 0.0 ? -1.0 : 1.0); + world = mat3(wtangent, wbitangent, wnormal); + + } + +[fragment shader] +#version 120 +#extension GL_ARB_texture_rectangle : enable +#define flat +#define texture2DRectOffset(sampler, coords, offset) texture2DRect(sampler, coords + vec2(offset)) +#define shadow2DRectOffset(sampler, coords, offset) shadow2DRect(sampler, coords + vec2(offset)) +#define fragdata(loc, name, type) +#define gcolor gl_FragData[0] +#define gnormal gl_FragData[1] +#define gglow gl_FragData[2] +varying mat3 world; + + + uniform vec2 envmapscale; + varying vec3 camvec; + + uniform vec4 colorscale; + uniform vec2 fullbright; + uniform vec2 maskscale; + uniform float alphatest; + uniform sampler2D tex0; + uniform sampler2D tex1; + uniform samplerCube tex2; + uniform sampler2D tex3; + + + fragdata(0, gcolor, vec4) + fragdata(1, gnormal, vec4) + fragdata(2, gglow, vec4) + + + + varying vec2 texcoord0; + uniform float aamask; + + void main(void) + { + vec4 diffuse = texture2D(tex0, texcoord0); + + + if(diffuse.a <= alphatest) + discard; + + + gcolor.rgb = diffuse.rgb*colorscale.rgb; + + + + + vec3 normal = texture2D(tex3, texcoord0).rgb - 0.5; + + normal = normalize(world * normal); + + + float spec = maskscale.x; + + vec3 masks = texture2D(tex1, texcoord0).rgb; + spec *= masks.r; + + + vec3 camn = normalize(camvec); + float invfresnel = dot(camn, normal); + vec3 rvec = 2.0*invfresnel*normal - camn; + float rmod = envmapscale.x*clamp(invfresnel, 0.0, 1.0) + envmapscale.y; + vec3 reflect = textureCube(tex2, rvec).rgb; + gcolor.rgb = mix(gcolor.rgb, reflect, rmod*masks.b); + + + gcolor.a = 0.5*spec; + + + float glowk = max(maskscale.y*masks.g, fullbright.y), colork = max(fullbright.x-glowk, 0.0); + + + + gglow.rgb = gcolor.rgb*glowk; + gcolor.rgb *= colork; + #define packnorm colorscale.a + + + + gnormal.rgb = normal*0.5 + 0.5; + #ifdef packnorm + gnormal.a = (packnorm); + #else + gnormal.a = 1.0; + #endif + + + + + + + } + + |