Created
April 4, 2020 13:16
-
-
Save Lumak/59de5b19522b0c1d182e02b838ad4b91 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0"?> | |
<material> | |
<technique name="Techniques/NoTextureFlip.xml" quality="0" loddistance="0" /> | |
<parameter name="MatDiffColor" value="0.9 0.9 0.9 1" /> | |
<parameter name="MatSpecColor" value="0.1 0.1 0.1 16" /> | |
<cull value="none" /> | |
<shadowcull value="none" /> | |
</material> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Uniforms.glsl" | |
#include "Samplers.glsl" | |
#include "Transform.glsl" | |
#include "ScreenPos.glsl" | |
#include "Lighting.glsl" | |
#include "Fog.glsl" | |
#ifdef NORMALMAP | |
varying vec4 vTexCoord; | |
varying vec4 vTangent; | |
#else | |
varying vec2 vTexCoord; | |
#endif | |
varying vec3 vNormal; | |
varying vec4 vWorldPos; | |
#ifdef VERTEXCOLOR | |
varying vec4 vColor; | |
#endif | |
#ifdef PERPIXEL | |
#ifdef SHADOW | |
#ifndef GL_ES | |
varying vec4 vShadowPos[NUMCASCADES]; | |
#else | |
varying highp vec4 vShadowPos[NUMCASCADES]; | |
#endif | |
#endif | |
#ifdef SPOTLIGHT | |
varying vec4 vSpotPos; | |
#endif | |
#ifdef POINTLIGHT | |
varying vec3 vCubeMaskVec; | |
#endif | |
#else | |
varying vec3 vVertexLight; | |
varying vec4 vScreenPos; | |
#ifdef ENVCUBEMAP | |
varying vec3 vReflectionVec; | |
#endif | |
#if defined(LIGHTMAP) || defined(AO) | |
varying vec2 vTexCoord2; | |
#endif | |
#endif | |
void VS() | |
{ | |
mat4 modelMatrix = iModelMatrix; | |
vec3 worldPos = GetWorldPos(modelMatrix); | |
gl_Position = GetClipPos(worldPos); | |
vNormal = GetWorldNormal(modelMatrix); | |
vWorldPos = vec4(worldPos, GetDepth(gl_Position)); | |
#ifdef VERTEXCOLOR | |
vColor = iColor; | |
#endif | |
#ifdef NORMALMAP | |
vec4 tangent = GetWorldTangent(modelMatrix); | |
vec3 bitangent = cross(tangent.xyz, vNormal) * tangent.w; | |
vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy); | |
vTangent = vec4(tangent.xyz, bitangent.z); | |
#else | |
vTexCoord = GetTexCoord(iTexCoord); | |
#endif | |
#ifdef PERPIXEL | |
// Per-pixel forward lighting | |
vec4 projWorldPos = vec4(worldPos, 1.0); | |
#ifdef SHADOW | |
// Shadow projection: transform from world space to shadow space | |
for (int i = 0; i < NUMCASCADES; i++) | |
vShadowPos[i] = GetShadowPos(i, vNormal, projWorldPos); | |
#endif | |
#ifdef SPOTLIGHT | |
// Spotlight projection: transform from world space to projector texture coordinates | |
vSpotPos = projWorldPos * cLightMatrices[0]; | |
#endif | |
#ifdef POINTLIGHT | |
vCubeMaskVec = (worldPos - cLightPos.xyz) * mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz); | |
#endif | |
#else | |
// Ambient & per-vertex lighting | |
#if defined(LIGHTMAP) || defined(AO) | |
// If using lightmap, disregard zone ambient light | |
// If using AO, calculate ambient in the PS | |
vVertexLight = vec3(0.0, 0.0, 0.0); | |
vTexCoord2 = iTexCoord1; | |
#else | |
vVertexLight = GetAmbient(GetZonePos(worldPos)); | |
#endif | |
#ifdef NUMVERTEXLIGHTS | |
for (int i = 0; i < NUMVERTEXLIGHTS; ++i) | |
vVertexLight += GetVertexLight(i, worldPos, vNormal) * cVertexLights[i * 3].rgb; | |
#endif | |
vScreenPos = GetScreenPos(gl_Position); | |
#ifdef ENVCUBEMAP | |
vReflectionVec = worldPos - cCameraPos; | |
#endif | |
#endif | |
vec3 n = cCameraPos - worldPos; | |
if (dot(n, vNormal) < 0.0) | |
{ | |
vNormal = -vNormal; | |
} | |
} | |
void PS() | |
{ | |
// Get material diffuse albedo | |
#ifdef DIFFMAP | |
vec4 diffInput = texture2D(sDiffMap, vTexCoord.xy); | |
#ifdef ALPHAMASK | |
if (diffInput.a < 0.5) | |
discard; | |
#endif | |
vec4 diffColor = cMatDiffColor * diffInput; | |
#else | |
vec4 diffColor = cMatDiffColor; | |
#endif | |
#ifdef VERTEXCOLOR | |
diffColor *= vColor; | |
#endif | |
// Get material specular albedo | |
#ifdef SPECMAP | |
vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord.xy).rgb; | |
#else | |
vec3 specColor = cMatSpecColor.rgb; | |
#endif | |
// Get normal | |
#ifdef NORMALMAP | |
mat3 tbn = mat3(vTangent.xyz, vec3(vTexCoord.zw, vTangent.w), vNormal); | |
vec3 normal = normalize(tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord.xy))); | |
#else | |
vec3 normal = normalize(vNormal); | |
#endif | |
// Get fog factor | |
#ifdef HEIGHTFOG | |
float fogFactor = GetHeightFogFactor(vWorldPos.w, vWorldPos.y); | |
#else | |
float fogFactor = GetFogFactor(vWorldPos.w); | |
#endif | |
#if defined(PERPIXEL) | |
// Per-pixel forward lighting | |
vec3 lightColor; | |
vec3 lightDir; | |
vec3 finalColor; | |
float diff = GetDiffuse(normal, vWorldPos.xyz, lightDir); | |
#ifdef SHADOW | |
diff *= GetShadow(vShadowPos, vWorldPos.w); | |
#endif | |
#if defined(SPOTLIGHT) | |
lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0); | |
#elif defined(CUBEMASK) | |
lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb; | |
#else | |
lightColor = cLightColor.rgb; | |
#endif | |
#ifdef SPECULAR | |
float spec = GetSpecular(normal, cCameraPosPS - vWorldPos.xyz, lightDir, cMatSpecColor.a); | |
finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a); | |
#else | |
finalColor = diff * lightColor * diffColor.rgb; | |
#endif | |
#ifdef AMBIENT | |
finalColor += cAmbientColor.rgb * diffColor.rgb; | |
finalColor += cMatEmissiveColor; | |
gl_FragColor = vec4(GetFog(finalColor, fogFactor), diffColor.a); | |
#else | |
gl_FragColor = vec4(GetLitFog(finalColor, fogFactor), diffColor.a); | |
#endif | |
#elif defined(PREPASS) | |
// Fill light pre-pass G-Buffer | |
float specPower = cMatSpecColor.a / 255.0; | |
gl_FragData[0] = vec4(normal * 0.5 + 0.5, specPower); | |
gl_FragData[1] = vec4(EncodeDepth(vWorldPos.w), 0.0); | |
#elif defined(DEFERRED) | |
// Fill deferred G-buffer | |
float specIntensity = specColor.g; | |
float specPower = cMatSpecColor.a / 255.0; | |
vec3 finalColor = vVertexLight * diffColor.rgb; | |
#ifdef AO | |
// If using AO, the vertex light ambient is black, calculate occluded ambient here | |
finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * cAmbientColor.rgb * diffColor.rgb; | |
#endif | |
#ifdef ENVCUBEMAP | |
finalColor += cMatEnvMapColor * textureCube(sEnvCubeMap, reflect(vReflectionVec, normal)).rgb; | |
#endif | |
#ifdef LIGHTMAP | |
finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * diffColor.rgb; | |
#endif | |
#ifdef EMISSIVEMAP | |
finalColor += cMatEmissiveColor * texture2D(sEmissiveMap, vTexCoord.xy).rgb; | |
#else | |
finalColor += cMatEmissiveColor; | |
#endif | |
gl_FragData[0] = vec4(GetFog(finalColor, fogFactor), 1.0); | |
gl_FragData[1] = fogFactor * vec4(diffColor.rgb, specIntensity); | |
gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower); | |
gl_FragData[3] = vec4(EncodeDepth(vWorldPos.w), 0.0); | |
#else | |
// Ambient & per-vertex lighting | |
vec3 finalColor = vVertexLight * diffColor.rgb; | |
#ifdef AO | |
// If using AO, the vertex light ambient is black, calculate occluded ambient here | |
finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * cAmbientColor.rgb * diffColor.rgb; | |
#endif | |
#ifdef MATERIAL | |
// Add light pre-pass accumulation result | |
// Lights are accumulated at half intensity. Bring back to full intensity now | |
vec4 lightInput = 2.0 * texture2DProj(sLightBuffer, vScreenPos); | |
vec3 lightSpecColor = lightInput.a * lightInput.rgb / max(GetIntensity(lightInput.rgb), 0.001); | |
finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor; | |
#endif | |
#ifdef ENVCUBEMAP | |
finalColor += cMatEnvMapColor * textureCube(sEnvCubeMap, reflect(vReflectionVec, normal)).rgb; | |
#endif | |
#ifdef LIGHTMAP | |
finalColor += texture2D(sEmissiveMap, vTexCoord2).rgb * diffColor.rgb; | |
#endif | |
#ifdef EMISSIVEMAP | |
finalColor += cMatEmissiveColor * texture2D(sEmissiveMap, vTexCoord.xy).rgb; | |
#else | |
finalColor += cMatEmissiveColor; | |
#endif | |
gl_FragColor = vec4(GetFog(finalColor, fogFactor), diffColor.a); | |
#endif | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<technique vs="LitSolidFlip" ps="LitSolidFlip" vsdefines="NOUV" > | |
<pass name="base" /> | |
<pass name="litbase" psdefines="AMBIENT" /> | |
<pass name="light" depthtest="equal" depthwrite="false" blend="add" /> | |
<pass name="prepass" psdefines="PREPASS" /> | |
<pass name="material" psdefines="MATERIAL" depthtest="equal" depthwrite="false" /> | |
<pass name="deferred" psdefines="DEFERRED" /> | |
<pass name="depth" vs="Depth" ps="Depth" /> | |
<pass name="shadow" vs="Shadow" ps="Shadow" /> | |
</technique> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment