]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - shader_glsl.h
Use saturated math and explicitly replace multiplication with negative value
[xonotic/darkplaces.git] / shader_glsl.h
index 11ec83dcde56c6c7ce93e78cd9f536f9e1bb6e80..4f9488c6b3f7e0c6827849bb13365019baecbb71 100644 (file)
 "# endif\n",
 "#endif\n",
 "\n",
+"#define sat(x) clamp(x, 0, 1)\n",
+"#define possat(x) sat(x)\n",//As replacement of max(x, 0) when x<=1, better for gpus that can't do 0-cycle max(x, 0)
+"#define possatdot(x, y) possat(dot(x, y))\n",
+"\n",
 "#ifdef USECELSHADING\n",
-"# define SHADEDIFFUSE myhalf diffuse = cast_myhalf(min(max(float(dot(surfacenormal, lightnormal)) * 2.0, 0.0), 1.0));\n",
+"# define SHADEDIFFUSE myhalf diffuse = cast_myhalf(sat(float(dot(surfacenormal, lightnormal)) * 2.0));\n",
 "# ifdef USEEXACTSPECULARMATH\n",
-"#  define SHADESPECULAR(specpow) myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), eyenormal))*-1.0, 0.0)), 1.0 + specpow);specular = max(0.0, specular * 10.0 - 9.0);\n",
+"#  define SHADESPECULAR(specpow) myhalf specular = pow(cast_myhalf(float(possatdot(reflect(lightnormal, surfacenormal), -eyenormal))), 1.0 + specpow);specular = possat(specular * 10.0 - 9.0);\n",
 "# else\n",
-"#  define SHADESPECULAR(specpow) myhalf3 specularnormal = normalize(lightnormal + eyenormal);myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), 0.0)), 1.0 + specpow);specular = max(0.0, specular * 10.0 - 9.0);\n",
+"#  define SHADESPECULAR(specpow) myhalf3 specularnormal = normalize(lightnormal + eyenormal);myhalf specular = pow(cast_myhalf(float(possatdot(surfacenormal, specularnormal))), 1.0 + specpow);specular = possat(specular * 10.0 - 9.0);\n",
 "# endif\n",
 "#else\n",
-"# define SHADEDIFFUSE myhalf diffuse = cast_myhalf(max(float(dot(surfacenormal, lightnormal)), 0.0));\n",
+"# define SHADEDIFFUSE myhalf diffuse = cast_myhalf(float(possatdot(surfacenormal, lightnormal)));\n",
 "# ifdef USEEXACTSPECULARMATH\n",
-"#  define SHADESPECULAR(specpow) myhalf specular = pow(cast_myhalf(max(float(dot(reflect(lightnormal, surfacenormal), eyenormal))*-1.0, 0.0)), 1.0 + specpow);\n",
+"#  define SHADESPECULAR(specpow) myhalf specular = pow(cast_myhalf(float(possatdot(reflect(lightnormal, surfacenormal), -eyenormal))), 1.0 + specpow);\n",
 "# else\n",
-"#  define SHADESPECULAR(specpow) myhalf3 specularnormal = normalize(lightnormal + eyenormal);myhalf specular = pow(cast_myhalf(max(float(dot(surfacenormal, specularnormal)), 0.0)), 1.0 + specpow);\n",
+"#  define SHADESPECULAR(specpow) myhalf3 specularnormal = normalize(lightnormal + eyenormal);myhalf specular = pow(cast_myhalf(float(possatdot(surfacenormal, specularnormal))), 1.0 + specpow);\n",
 "# endif\n",
 "#endif\n",
 "\n",
 "#endif\n",
 "\n",
 "#ifdef MODE_DEPTH_OR_SHADOW\n",
-"dp_varying highp float Depth;\n",
 "#ifdef VERTEX_SHADER\n",
 "void main(void)\n",
 "{\n",
 "#ifdef USETRIPPY\n",
 "      gl_Position = TrippyVertex(gl_Position);\n",
 "#endif\n",
-"      Depth = gl_Position.z;\n",
 "}\n",
 "#endif\n",
 "\n",
 "void main(void)\n",
 "{\n",
 "#ifdef USEDEPTHRGB\n",
-"      dp_FragColor = encodedepthmacro(Depth);\n",
+"      dp_FragColor = encodedepthmacro(gl_FragCoord.z);\n",
 "#else\n",
 "      dp_FragColor = vec4(1.0,1.0,1.0,1.0);\n",
 "#endif\n",
 "\n",
 "void main(void)\n",
 "{\n",
+"#ifdef USECOLORFRINGE\n",
 "      float fringe = ColorFringe;//.0033f;\n",
 "      float amount = distance(TexCoord1, vec2(.5f,.5f));\n",
 "      vec2 offset = vec2(amount*fringe,amount*fringe);\n",
-"      dp_FragColor.xy = texture(Texture_First, TexCoord1-offset).xy;\n",
-"      dp_FragColor.z = texture(Texture_First, TexCoord1+offset).z;\n",
+"      dp_FragColor.xy = dp_texture2D(Texture_First, TexCoord1-offset).xy;\n",
+"      dp_FragColor.z = dp_texture2D(Texture_First, TexCoord1+offset).z;\n",
+"#else\n",
+"      dp_FragColor = dp_texture2D(Texture_First, TexCoord1);\n",
+"#endif\n",
 "\n",
 "#ifdef USEFXAA\n",
 "      dp_FragColor = fxaa(dp_FragColor, 8.0); // 8.0 can be changed for larger span\n",