[Evas: Evas_3D] Refactor shader system: refactored flat shade mode.

Reviewers: cedric, jpeg

Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D2224
This commit is contained in:
Dmytro Dadyka 2015-03-24 10:49:25 -07:00 committed by Jean-Philippe ANDRE
parent ce5a912419
commit 8110ec94f4
4 changed files with 72 additions and 264 deletions

View File

@ -252,7 +252,7 @@ static const char const flat_vert_glsl[] =
"}\n"
"void main()\n"
"{\n"
"#ifdef VERTEX_POSITION_BLEND\n"
" #ifdef VERTEX_POSITION_BLEND\n"
" vec4 position = aPosition0 * uPositionWeight +\n"
" aPosition1 * (1.0 - uPositionWeight);\n"
" position = vec4(position.xyz, 1.0);\n"
@ -261,7 +261,7 @@ static const char const flat_vert_glsl[] =
" vec4 position = vec4(aPosition0.xyz, 1.0);\n"
"#endif // VERTEX_POSITION\n"
"#endif //VERTEX_POSITION_BLEND\n"
"#ifdef VERTEX_NORMAL_BLEND\n"
" #ifdef VERTEX_NORMAL_BLEND\n"
" vec3 normal = aNormal0.xyz * uNormalWeight +\n"
" aNormal1.xyz * (1.0 - uNormalWeight);\n"
"#else\n"
@ -269,7 +269,7 @@ static const char const flat_vert_glsl[] =
" vec3 normal = aNormal0.xyz;\n"
"#endif //VERTEX_NORMAL\n"
"#endif //VERTEX_NORMAL_BLEND\n"
"#ifdef VERTEX_TEXCOORD_BLEND\n"
" #ifdef VERTEX_TEXCOORD_BLEND\n"
" vTexCoord = aTexCoord0.st * uTexCoordWeight +\n"
" aTexCoord1.st * (1.0 - uTexCoordWeight);\n"
"#else\n"
@ -279,9 +279,9 @@ static const char const flat_vert_glsl[] =
"#endif //VERTEX_TEXCOORD_BLEND\n"
" gl_Position = uMatrixMvp * position;\n"
" vertexFlat(position, normal);\n"
"#ifdef SHADOWED\n"
" #ifdef SHADOWED\n"
" vLightPosition = uMatrixLight * position;\n"
"#endif\n"
"#endif //SHADOWED\n"
"}\n";
static const char const flat_frag_glsl[] =
@ -302,6 +302,16 @@ static const char const flat_frag_glsl[] =
"varying vec4 vLightPosition;\n"
"uniform sampler2D uShadowMap;\n"
"float shadow;\n"
"float pcf(vec4 lpos, float size)\n"
" {\n"
" vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n"
" float i, j, randx, randy, shadow;\n"
" shadow = 0.0;\n"
" for (i = -4.0; i < 4.0; i++)\n"
" for (j = -4.0; j < 4.0; j++)\n"
" shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0)*size).x);\n"
" return shadow / 64.0;\n"
"}\n"
"#endif //SHADOWED\n"
"#ifdef DIFFUSE\n"
"uniform vec4 uMaterialDiffuse;\n"
@ -347,44 +357,34 @@ static const char const flat_frag_glsl[] =
"uniform float uTextureEmissionWeight;\n"
"#endif //EMISSION_TEXTURE_BLEND\n"
"#endif //EMISSION\n"
"#ifdef SHADOWED\n"
"float pcf(vec4 lpos, float size)\n"
"{\n"
" vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n"
" float i, j, randx, randy, shadow;\n"
" shadow = 0.0;\n"
" for (i = -4.0; i < 4.0; i++)\n"
" for (j = -4.0; j < 4.0; j++)\n"
" shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy +vec2(i / 8.0, j / 8.0)*size).x);\n"
" return shadow / 64.0;\n"
"}\n"
"#endif //SHADOWED\n"
"void fragmentFlat()\n"
"{\n"
" vec4 color;\n"
"#ifdef DIFFUSE\n"
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" color = texture2D(uTextureDiffuse0, vTexCoord) * uTextureDiffuseWeight +\n"
" texture2D(uTextureDiffuse1, vTexCoord) * (1.0 - uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
" \n"
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" color = texture2D(uTextureDiffuse0, vTexCoord) * uTextureDiffuseWeight +\n"
" texture2D(uTextureDiffuse1, vTexCoord) * (1.0 - uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
"#else\n"
"#ifdef DIFFUSE_TEXTURE\n"
" color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n"
" color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n"
"#else\n"
" color = uMaterialDiffuse;\n"
" color = uMaterialDiffuse;\n"
"#endif //DIFFUSE_TEXTURE\n"
"#endif //DIFFUSE_TEXTURE_BLEND\n"
" gl_FragColor = uLightDiffuse * color * vFactor.x;\n"
" gl_FragColor = uLightDiffuse * color * vFactor.x;\n"
"#else\n"
" gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n"
" gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n"
"#endif //DIFFUSE\n"
"#ifdef SPECULAR\n"
"#ifdef SPECULAR_TEXTURE_BLEND\n"
" \n"
"#ifdef SPECULAR_TEXTURE_BLEND\n"
" color = texture2D(uTextureSpecular0, vTexCoord) * uTextureSpecularWeight +\n"
" texture2D(uTextureSpecular1, vTexCoord) * (1.0 - uTextureSpecularWeight);\n"
" color *= uMaterialSpecular;\n"
"#else\n"
"#ifdef SPECULAR_TEXTURE\n"
"#ifdef SPECULAR_TEXTURE\n"
" color = texture2D(uTextureSpecular0, vTexCoord) * uMaterialSpecular;\n"
"#else\n"
" color = uMaterialSpecular;\n"
@ -395,13 +395,14 @@ static const char const flat_frag_glsl[] =
"#ifdef SHADOWED\n"
" gl_FragColor *= shadow;\n"
"#endif //SHADOWED\n"
"#ifdef E3D_SHADER_FLAG_AMBIENT\n"
"#ifdef AMBIENT_TEXTURE_BLEND\n"
"#ifdef AMBIENT\n"
" \n"
"#ifdef AMBIENT_TEXTURE_BLEND\n"
" color = texture2D(uTextureAmbient0, vTexCoord) * uTextureAmbientWeight +\n"
" texture2D(uTextureAmbient1, vTexCoord) * (1.0 - uTextureAmbientWeight);\n"
" color *= uMaterialAmbient;\n"
"#else\n"
"#ifdef AMBIENT_TEXTURE\n"
"#ifdef AMBIENT_TEXTURE\n"
" color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;\n"
"#else\n"
" color = uMaterialAmbient;\n"
@ -409,13 +410,14 @@ static const char const flat_frag_glsl[] =
"#endif //AMBIENT_TEXTURE_BLEND\n"
" gl_FragColor += uLightAmbient * color;\n"
"#endif //AMBIENT\n"
"#ifdef EMISSION\n"
"#ifdef EMISSION_TEXTURE_BLEND\n"
"#ifdef EMISSION\n"
" \n"
"#ifdef EMISSION_TEXTURE_BLEND\n"
" color = texture2D(uTextureEmission0, vTexCoord) * uTextureEmissionWeight +\n"
" texture2D(uTextureEmission1, vTexCoord) * (1.0 - uTextureEmissionWeight);\n"
" color *= uMaterialEmission;\n"
"#else\n"
"#ifdef EMISSION_TEXTURE\n"
"#ifdef EMISSION_TEXTURE\n"
" color = texture2D(uTextureEmission0, vTexCoord) * uMaterialEmission;\n"
"#else\n"
" color = uMaterialEmission;\n"
@ -429,9 +431,10 @@ static const char const flat_frag_glsl[] =
" shadow = pcf(vLightPosition, 1.0 / 200.0);\n"
"#endif //SHADOWED\n"
" fragmentFlat();\n"
" \n"
"#ifdef FOG_ENABLED\n"
" float z = gl_FragCoord.z / gl_FragCoord.w;\n"
" float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);\n"
" float fogFactor = exp2(-uFogFactor * uFogFactor * z * z * 1.44);\n"
" fogFactor = clamp(fogFactor, 0.0, 1.0);\n"
" gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);\n"
"#endif //FOG_ENABLED\n"
@ -637,9 +640,10 @@ static const char const phong_frag_glsl[] =
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" color = texture2D(uTextureDiffuse0, vTexCoord) * uTextureDiffuseWeight +\n"
" texture2D(uTextureDiffuse1, vTexCoord) * (1.0 - uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
"#else\n"
"#ifdef DIFFUSE_TEXTURE\n"
" color = texture2D(uTextureDiffuse0, vTexCoord);\n"
" color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;\n"
"#else\n"
" color = uMaterialDiffuse;\n"
"#endif //DIFFUSE_TEXTURE\n"
@ -658,9 +662,10 @@ static const char const phong_frag_glsl[] =
"#ifdef SPECULAR_TEXTURE_BLEND\n"
" color = texture2D(uTextureSpecular0, vTexCoord) * uTextureSpecularWeight +\n"
" texture2D(uTextureSpecular1, vTexCoord) * (1.0 - uTextureSpecularWeight);\n"
" color *= uMaterialSpecular;\n"
"#else\n"
"#ifdef SPECULAR_TEXTURE\n"
" color = texture2D(uTextureSpecular0, vTexCoord);\n"
" color = texture2D(uTextureSpecular0, vTexCoord) * uMaterialSpecular;\n"
"#else\n"
" color = uMaterialSpecular;\n"
"#endif //SPECULAR_TEXTURE\n"
@ -679,9 +684,10 @@ static const char const phong_frag_glsl[] =
"#ifdef AMBIENT_TEXTURE_BLEND\n"
" color = texture2D(uTextureAmbient0, vTexCoord) * uTextureAmbientWeight +\n"
" texture2D(uTextureAmbient1, vTexCoord) * (1.0 - uTextureAmbientWeight);\n"
" color *= uMaterialAmbient;\n"
"#else\n"
"#ifdef AMBIENT_TEXTURE\n"
" color = texture2D(uTextureAmbient0, vTexCoord);\n"
" color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;\n"
"#else\n"
" color = uMaterialAmbient;\n"
"#endif //AMBIENT_TEXTURE\n"
@ -698,9 +704,10 @@ static const char const phong_frag_glsl[] =
"#ifdef EMISSION_TEXTURE_BLEND\n"
" color = texture2D(uTextureEmission0, vTexCoord) * uTextureEmissionWeight +\n"
" texture2D(uTextureEmission1, vTexCoord) * (1.0 - uTextureEmissionWeight);\n"
" color *= uMaterialEmission;\n"
"#else\n"
"#ifdef EMISSION_TEXTURE\n"
" color = texture2D(uTextureEmission0, vTexCoord);\n"
" color = texture2D(uTextureEmission0, vTexCoord) * uMaterialEmission;\n"
"#else\n"
" color = uMaterialEmission;\n"
"#endif //EMISSION_TEXTURE\n"

View File

@ -1,92 +1,12 @@
varying vec2 vFactor;
#ifdef NEED_TEX_COORD
varying vec2 vTexCoord;
#endif //TEX_COORD
#ifdef FOG_ENABLED
uniform float uFogFactor;
uniform vec4 uFogColor;
#endif //FOG_ENABLED
#ifdef SHADOWED
varying vec4 vLightPosition;
uniform sampler2D uShadowMap;
float shadow;
#endif //SHADOWED
#ifdef DIFFUSE
uniform vec4 uMaterialDiffuse;
uniform vec4 uLightDiffuse;
#ifdef DIFFUSE_TEXTURE
uniform sampler2D uTextureDiffuse0;
#endif //DIFFUSE_TEXTURE
#ifdef DIFFUSE_TEXTURE_BLEND
uniform sampler2D uTextureDiffuse1;
uniform float uTextureDiffuseWeight;
#endif //DIFFUSE_TEXTURE_BLEND
#endif //DIFFUSE
#ifdef SPECULAR
uniform vec4 uLightSpecular;
uniform float uMaterialShininess;
uniform vec4 uMaterialSpecular;
#ifdef SPECULAR_TEXTURE
uniform sampler2D uTextureSpecular0;
#endif //SPECULAR_TEXTURE
#ifdef SPECULAR_TEXTURE_BLEND
uniform sampler2D uTextureSpecular1;
uniform float uTextureSpecularWeight;
#endif //SPECULAR_TEXTURE_BLEND
#endif //SPECULAR
#ifdef AMBIENT
uniform vec4 uMaterialAmbient;
uniform vec4 uLightAmbient;
#ifdef AMBIENT_TEXTURE
uniform sampler2D uTextureAmbient0;
#endif //AMBIENT_TEXTURE
#ifdef AMBIENT_TEXTURE_BLEND
uniform sampler2D uTextureAmbient1;
uniform float uTextureAmbientWeight;
#endif //AMBIENT_TEXTURE_BLEND
#endif //AMBIENT
#ifdef EMISSION
uniform vec4 uMaterialEmission;
#ifdef EMISSION_TEXTURE
uniform sampler2D uTextureEmission0;
#endif //EMISSION_TEXTURE
#ifdef EMISSION_TEXTURE_BLEND
uniform sampler2D uTextureEmission1;
uniform float uTextureEmissionWeight;
#endif //EMISSION_TEXTURE_BLEND
#endif //EMISSION
#ifdef SHADOWED
float pcf(vec4 lpos, float size)
{
vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;
float i, j, randx, randy, shadow;
shadow = 0.0;
for (i = -4.0; i < 4.0; i++)
for (j = -4.0; j < 4.0; j++)
shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy +vec2(i / 8.0, j / 8.0)*size).x);
return shadow / 64.0;
}
#endif //SHADOWED
FRAGMENT_SHADER_USE_TEX_COORD
FRAGMENT_SHADER_USE_FOG
FRAGMENT_SHADER_USE_SHADOWS
FRAGMENT_SHADER_USE_DIFFUSE_TERM
FRAGMENT_SHADER_USE_SPECULAR_TERM
FRAGMENT_SHADER_USE_AMBIENT_TERM
FRAGMENT_SHADER_USE_EMISSION_TERM
void fragmentFlat()
{
@ -94,40 +14,15 @@ void fragmentFlat()
#ifdef DIFFUSE
#ifdef DIFFUSE_TEXTURE_BLEND
color = texture2D(uTextureDiffuse0, vTexCoord) * uTextureDiffuseWeight +
texture2D(uTextureDiffuse1, vTexCoord) * (1.0 - uTextureDiffuseWeight);
color *= uMaterialDiffuse;
FRAGMENT_SHADER_TEXTURE_BLEND(DIFFUSE, Diffuse)
gl_FragColor = uLightDiffuse * color * vFactor.x;
#else
#ifdef DIFFUSE_TEXTURE
color = texture2D(uTextureDiffuse0, vTexCoord) * uMaterialDiffuse;
#else
color = uMaterialDiffuse;
#endif //DIFFUSE_TEXTURE
#endif //DIFFUSE_TEXTURE_BLEND
gl_FragColor = uLightDiffuse * color * vFactor.x;
#else
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
#endif //DIFFUSE
#ifdef SPECULAR
#ifdef SPECULAR_TEXTURE_BLEND
color = texture2D(uTextureSpecular0, vTexCoord) * uTextureSpecularWeight +
texture2D(uTextureSpecular1, vTexCoord) * (1.0 - uTextureSpecularWeight);
color *= uMaterialSpecular;
#else
#ifdef SPECULAR_TEXTURE
color = texture2D(uTextureSpecular0, vTexCoord) * uMaterialSpecular;
#else
color = uMaterialSpecular;
#endif //SPECULAR_TEXTURE
#endif //SPECULAR_TEXTURE_BLEND
FRAGMENT_SHADER_TEXTURE_BLEND(SPECULAR, Specular)
gl_FragColor += uLightSpecular * color * vFactor.y;
#endif //SPECULAR
@ -136,42 +31,15 @@ void fragmentFlat()
gl_FragColor *= shadow;
#endif //SHADOWED
#ifdef E3D_SHADER_FLAG_AMBIENT
#ifdef AMBIENT
#ifdef AMBIENT_TEXTURE_BLEND
color = texture2D(uTextureAmbient0, vTexCoord) * uTextureAmbientWeight +
texture2D(uTextureAmbient1, vTexCoord) * (1.0 - uTextureAmbientWeight);
color *= uMaterialAmbient;
#else
#ifdef AMBIENT_TEXTURE
color = texture2D(uTextureAmbient0, vTexCoord) * uMaterialAmbient;
#else
color = uMaterialAmbient;
#endif //AMBIENT_TEXTURE
#endif //AMBIENT_TEXTURE_BLEND
FRAGMENT_SHADER_TEXTURE_BLEND(AMBIENT, Ambient)
gl_FragColor += uLightAmbient * color;
#endif //AMBIENT
#ifdef EMISSION
#ifdef EMISSION_TEXTURE_BLEND
color = texture2D(uTextureEmission0, vTexCoord) * uTextureEmissionWeight +
texture2D(uTextureEmission1, vTexCoord) * (1.0 - uTextureEmissionWeight);
color *= uMaterialEmission;
#else
#ifdef EMISSION_TEXTURE
color = texture2D(uTextureEmission0, vTexCoord) * uMaterialEmission;
#else
color = uMaterialEmission;
#endif //EMISSION_TEXTURE
#endif //EMISSION_TEXTURE_BLEND
#ifdef EMISSION
FRAGMENT_SHADER_TEXTURE_BLEND(EMISSION, Emission)
gl_FragColor += color;
#endif //EMISSION
@ -185,11 +53,5 @@ void main() {
fragmentFlat();
#ifdef FOG_ENABLED
float z = gl_FragCoord.z / gl_FragCoord.w;
float fogFactor = exp2( -uFogFactor * uFogFactor * z * z * 1.44);
fogFactor = clamp(fogFactor, 0.0, 1.0);
gl_FragColor = mix(uFogColor, gl_FragColor, fogFactor);
#endif //FOG_ENABLED
FRAGMENT_SHADER_FOG_APPLY
}

View File

@ -4,41 +4,11 @@ uniform mat4 uMatrixModelview;
uniform vec4 uLightPosition;
varying vec2 vFactor;
#ifdef SHADOWED
uniform mat4 uMatrixLight;
varying vec4 vLightPosition;
#endif //SHADOWED
#ifdef VERTEX_POSITION
attribute vec4 aPosition0;
#endif //VERTEX_POSITION
#ifdef VERTEX_POSITION_BLEND
attribute vec4 aPosition1;
uniform float uPositionWeight;
#endif //VERTEX_POSITION_BLEND
#ifdef VERTEX_NORMAL
attribute vec4 aNormal0;
#endif //VERTEX_NORMAL
#ifdef VERTEX_NORMAL_BLEND
attribute vec4 aNormal1;
uniform float uNormalWeight;
#endif //VERTEX_NORMAL_BLEND
#ifdef VERTEX_TEXCOORD
attribute vec4 aTexCoord0;
#endif //VERTEX_TEXCOORD
#ifdef VERTEX_TEXCOORD_BLEND
attribute vec4 aTexCoord1;
uniform float uTexCoordWeight;
#endif //VERTEX_TEXCOORD_BLEND
#ifdef NEED_TEX_COORD
varying vec2 vTexCoord;
#endif //NEED_TEX_COORD
VERTEX_SHADER_USE_SHADOWS
VERTEX_SHADER_USE_POSITION
VERTEX_SHADER_USE_NORMALS
VERTEX_SHADER_USE_TEXCOORD
VERTEX_SHADER_NEED_TEX_COORD
#ifdef LIGHT_SPOT
uniform vec3 uLightSpotDir;
@ -111,44 +81,12 @@ void vertexFlat(vec4 position, vec3 normal)
void main()
{
#ifdef VERTEX_POSITION_BLEND
vec4 position = aPosition0 * uPositionWeight +
aPosition1 * (1.0 - uPositionWeight);
position = vec4(position.xyz, 1.0);
#else
#ifdef VERTEX_POSITION
vec4 position = vec4(aPosition0.xyz, 1.0);
#endif // VERTEX_POSITION
#endif //VERTEX_POSITION_BLEND
#ifdef VERTEX_NORMAL_BLEND
vec3 normal = aNormal0.xyz * uNormalWeight +
aNormal1.xyz * (1.0 - uNormalWeight);
#else
#ifdef VERTEX_NORMAL
vec3 normal = aNormal0.xyz;
#endif //VERTEX_NORMAL
#endif //VERTEX_NORMAL_BLEND
#ifdef VERTEX_TEXCOORD_BLEND
vTexCoord = aTexCoord0.st * uTexCoordWeight +
aTexCoord1.st * (1.0 - uTexCoordWeight);
#else
#ifdef VERTEX_TEXCOORD
vTexCoord = aTexCoord0.st;
#endif //VERTEX_TEXCOORD
#endif //VERTEX_TEXCOORD_BLEND
VERTEX_SHADER_POSITION
VERTEX_SHADER_NORMAL
VERTEX_SHADER_TEXCOORD
gl_Position = uMatrixMvp * position;
vertexFlat(position, normal);
#ifdef SHADOWED
vLightPosition = uMatrixLight * position;
#endif
VERTEX_SHADER_SHADOWED
}

View File

@ -63,9 +63,10 @@ define(`FRAGMENT_SHADER_TEXTURE_BLEND', `
#ifdef $1_TEXTURE_BLEND
color = texture2D(uTexture$2`0', vTexCoord) * uTexture$2Weight +
texture2D(uTexture$2`1', vTexCoord) * (1.0 - uTexture$2Weight);
color *= uMaterial$2;
#else
#ifdef $1_TEXTURE
color = texture2D(uTexture$2`0', vTexCoord);
color = texture2D(uTexture$2`0', vTexCoord) * uMaterial$2;
#else
color = uMaterial$2;
#endif //$1_TEXTURE