X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=shader_glsl.h;h=4e37e273f7feecbf4156cb08e695e8603c70a582;hb=0e0847b55300c06ea49db519a78cb8a27528ea8a;hp=0c01478efe89a60d8ba68350d4826b9e3f46fb56;hpb=2924a0a6e6f62043eb92c77db28434ef76b86461;p=xonotic%2Fdarkplaces.git diff --git a/shader_glsl.h b/shader_glsl.h index 0c01478e..4e37e273 100644 --- a/shader_glsl.h +++ b/shader_glsl.h @@ -16,10 +16,11 @@ "# define dp_offsetmapping_dFdx dFdx\n" "# define dp_offsetmapping_dFdy dFdy\n" "# define dp_textureGrad textureGrad\n" +"# define dp_textureOffset(a,b,c,d) textureOffset(a,b,ivec2(c,d))\n" "# define dp_texture2D texture\n" "# define dp_texture3D texture\n" "# define dp_textureCube texture\n" -"# define dp_shadow2D(a,b) texture(a,b)\n" +"# define dp_shadow2D(a,b) float(texture(a,b))\n" "#else\n" "# ifdef FRAGMENT_SHADER\n" "# define dp_FragColor gl_FragColor\n" @@ -29,6 +30,7 @@ "# define dp_offsetmapping_dFdx(a) vec2(0.0, 0.0)\n" "# define dp_offsetmapping_dFdy(a) vec2(0.0, 0.0)\n" "# define dp_textureGrad(a,b,c,d) texture2D(a,b)\n" +"# define dp_textureOffset(a,b,c,d) texture2DOffset(a,b,ivec2(c,d))\n" "# define dp_texture2D texture2D\n" "# define dp_texture3D texture3D\n" "# define dp_textureCube textureCube\n" @@ -43,9 +45,6 @@ "#define highp\n" "#endif\n" "\n" -"// not REALLY the smallest value (2^-62 would be correct), but short and any compiler failing at parsing this is broken\n" -"#define FLT_MIN 0.000000000000000001\n" -"\n" "#ifdef VERTEX_SHADER\n" "dp_attribute vec4 Attrib_Position; // vertex\n" "dp_attribute vec4 Attrib_Color; // color\n" @@ -674,6 +673,7 @@ "\n" "#ifdef USEOFFSETMAPPING\n" "uniform mediump vec4 OffsetMapping_ScaleSteps;\n" +"uniform mediump float OffsetMapping_Bias;\n" "#ifdef USEOFFSETMAPPING_LOD\n" "uniform mediump float OffsetMapping_LodDistance;\n" "#endif\n" @@ -696,7 +696,7 @@ " //vec3 OffsetVector = vec3(EyeVectorFogDepth.xy * ((1.0 / EyeVectorFogDepth.z) * ScaleSteps.x) * vec2(-1, 1), -1);\n" " //vec3 OffsetVector = vec3(normalize(EyeVectorFogDepth.xy) * ScaleSteps.x * vec2(-1, 1), -1);\n" " vec3 OffsetVector = vec3(normalize(EyeVectorFogDepth.xyz).xy * ScaleSteps.x * vec2(-1, 1), -1);\n" -" vec3 RT = vec3(TexCoord, 1);\n" +" vec3 RT = vec3(vec2(TexCoord.xy - OffsetVector.xy*OffsetMapping_Bias), 1);\n" " OffsetVector *= ScaleSteps.z;\n" " for(i = 1.0; i < ScaleSteps.y; ++i)\n" " RT += OffsetVector * step(dp_textureGrad(Texture_Normal, RT.xy, dPdx, dPdy).a, RT.z);\n" @@ -710,7 +710,7 @@ " vec2 OffsetVector = vec2(normalize(EyeVectorFogDepth.xyz).xy * ScaleSteps.x * vec2(-1, 1));\n" " OffsetVector *= ScaleSteps.z;\n" " for(i = 0.0; i < ScaleSteps.y; ++i)\n" -" TexCoord += OffsetVector * (1.0 - dp_textureGrad(Texture_Normal, TexCoord, dPdx, dPdy).a);\n" +" TexCoord += OffsetVector * ((1.0 - OffsetMapping_Bias) - dp_textureGrad(Texture_Normal, TexCoord, dPdx, dPdy).a);\n" " return TexCoord;\n" "#endif\n" "}\n" @@ -748,20 +748,19 @@ "vec3 GetShadowMapTC2D(vec3 dir)\n" "{\n" " vec3 adir = abs(dir);\n" -" vec2 aparams = ShadowMap_Parameters.xy / max(max(adir.x, adir.y), adir.z);\n" +" vec2 mparams = ShadowMap_Parameters.xy / max(max(adir.x, adir.y), adir.z);\n" " vec4 proj = dp_textureCube(Texture_CubeProjection, dir);\n" -" return vec3(mix(dir.xy, dir.zz, proj.xy) * aparams.x + proj.zw * ShadowMap_Parameters.z, aparams.y + ShadowMap_Parameters.w);\n" +" return vec3(mix(dir.xy, dir.zz, proj.xy) * mparams.x + proj.zw * ShadowMap_Parameters.z, mparams.y + ShadowMap_Parameters.w);\n" "}\n" "# else\n" "vec3 GetShadowMapTC2D(vec3 dir)\n" "{\n" " vec3 adir = abs(dir);\n" -" float ma = adir.z;\n" -" vec4 proj = vec4(dir, 2.5);\n" -" if (adir.x > ma) { ma = adir.x; proj = vec4(dir.zyx, 0.5); }\n" -" if (adir.y > ma) { ma = adir.y; proj = vec4(dir.xzy, 1.5); }\n" -" vec2 aparams = ShadowMap_Parameters.xy / ma;\n" -" return vec3(proj.xy * aparams.x + vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.z, aparams.y + ShadowMap_Parameters.w);\n" +" float m; vec4 proj;\n" +" if (adir.x > adir.y) { m = adir.x; proj = vec4(dir.zyx, 0.5); } else { m = adir.y; proj = vec4(dir.xzy, 1.5); }\n" +" if (adir.z > m) { m = adir.z; proj = vec4(dir, 2.5); }\n" +" vec2 mparams = ShadowMap_Parameters.xy / m;\n" +" return vec3(proj.xy * mparams.x + vec2(proj.z < 0.0 ? 1.5 : 0.5, proj.w) * ShadowMap_Parameters.z, mparams.y + ShadowMap_Parameters.w);\n" "}\n" "# endif\n" "# endif\n" @@ -821,7 +820,7 @@ "# endif\n" "# else\n" "# ifdef GL_EXT_gpu_shader4\n" -"# define texval(x, y) texture2DOffset(Texture_ShadowMap2D, center, ivec2(x, y)).r\n" +"# define texval(x, y) dp_textureOffset(Texture_ShadowMap2D, center, x, y).r\n" "# else\n" "# define texval(x, y) dp_texture2D(Texture_ShadowMap2D, center + vec2(x, y)*ShadowMap_TextureScale).r \n" "# endif\n" @@ -981,10 +980,10 @@ " // calculate directional shading\n" " vec3 eyevector = position * -1.0;\n" "# ifdef USEEXACTSPECULARMATH\n" -" myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), normalize(eyevector)))*-1.0, FLT_MIN)), SpecularPower * normalmap.a);\n" +" myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), normalize(eyevector)))*-1.0, 0.0)), 1.0 + SpecularPower * normalmap.a);\n" "# else\n" " myhalf3 specularnormal = normalize(lightnormal + cast_myhalf3(normalize(eyevector)));\n" -" myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), FLT_MIN)), SpecularPower * normalmap.a);\n" +" myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), 0.0)), 1.0 + SpecularPower * normalmap.a);\n" "# endif\n" "#endif\n" "\n" @@ -1240,10 +1239,10 @@ " color.rgb = diffusetex * (Color_Ambient + diffuse * Color_Diffuse);\n" "#ifdef USESPECULAR\n" "#ifdef USEEXACTSPECULARMATH\n" -" myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), normalize(EyeVectorFogDepth.xyz)))*-1.0, FLT_MIN)), SpecularPower * glosstex.a);\n" +" myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), normalize(EyeVectorFogDepth.xyz)))*-1.0, 0.0)), 1.0 + SpecularPower * glosstex.a);\n" "#else\n" " myhalf3 specularnormal = normalize(lightnormal + cast_myhalf3(normalize(EyeVectorFogDepth.xyz)));\n" -" myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), FLT_MIN)), SpecularPower * glosstex.a);\n" +" myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), 0.0)), 1.0 + SpecularPower * glosstex.a);\n" "#endif\n" " color.rgb += glosstex.rgb * (specular * Color_Specular);\n" "#endif\n" @@ -1335,10 +1334,10 @@ " myhalf diffuse = cast_myhalf(max(float(dot(surfacenormal, lightnormal)), 0.0));\n" "# ifdef USESPECULAR\n" "# ifdef USEEXACTSPECULARMATH\n" -" myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), normalize(EyeVectorFogDepth.xyz)))*-1.0, FLT_MIN)), SpecularPower * glosstex.a);\n" +" myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), normalize(EyeVectorFogDepth.xyz)))*-1.0, 0.0)), 1.0 + SpecularPower * glosstex.a);\n" "# else\n" " myhalf3 specularnormal = normalize(lightnormal + cast_myhalf3(normalize(EyeVectorFogDepth.xyz)));\n" -" myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), FLT_MIN)), SpecularPower * glosstex.a);\n" +" myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), 0.0)), 1.0 + SpecularPower * glosstex.a);\n" "# endif\n" " color.rgb = diffusetex * Color_Ambient + (diffusetex * Color_Diffuse * diffuse + glosstex.rgb * Color_Specular * specular) * lightcolor;\n" "# else\n"