nkeynes@1130: /** nkeynes@1130: * $Id$ nkeynes@1130: * nkeynes@1130: * Assorted shader definitions (optionally) used by the PVR2 rendering nkeynes@1130: * engine. nkeynes@1130: * nkeynes@1130: * This file is preprocessed by genglsl to produce shaders.c and shaders.h. nkeynes@1130: * nkeynes@1130: * Copyright (c) 2007-2010 Nathan Keynes. nkeynes@1130: * nkeynes@1130: * This program is free software; you can redistribute it and/or modify nkeynes@1130: * it under the terms of the GNU General Public License as published by nkeynes@1130: * the Free Software Foundation; either version 2 of the License, or nkeynes@1130: * (at your option) any later version. nkeynes@1130: * nkeynes@1130: * This program is distributed in the hope that it will be useful, nkeynes@1130: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@1130: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@1130: * GNU General Public License for more details. nkeynes@1130: */ nkeynes@1130: nkeynes@1140: /** nkeynes@1140: * Quick reference for predefined variables nkeynes@1140: nkeynes@1140: * Vertex shader input variables: nkeynes@1140: * vec4 gl_Color; nkeynes@1140: * vec4 gl_SecondaryColor; nkeynes@1140: * vec3 gl_Normal; nkeynes@1140: * vec4 gl_Vertex; nkeynes@1140: * vec4 gl_MultiTexCoord0; nkeynes@1140: * vec4 gl_MultiTexCoord1; nkeynes@1140: * vec4 gl_MultiTexCoord2; nkeynes@1140: * vec4 gl_MultiTexCoord3; nkeynes@1140: * vec4 gl_MultiTexCoord4; nkeynes@1140: * vec4 gl_MultiTexCoord5; nkeynes@1140: * vec4 gl_MultiTexCoord6; nkeynes@1140: * vec4 gl_MultiTexCoord7; nkeynes@1140: * float gl_FogCoord; nkeynes@1140: * nkeynes@1140: * Vertex shader output variables: nkeynes@1140: * vec4 gl_Position; // must be written to nkeynes@1140: * float gl_PointSize; // may be written to nkeynes@1140: * vec4 gl_ClipVertex; // may be written to nkeynes@1140: * varying vec4 gl_FrontColor; nkeynes@1140: * varying vec4 gl_BackColor; nkeynes@1140: * varying vec4 gl_FrontSecondaryColor; nkeynes@1140: * varying vec4 gl_BackSecondaryColor; nkeynes@1140: * varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords nkeynes@1140: * varying float gl_FogFragCoord; nkeynes@1140: * nkeynes@1140: * Fragment shader input variables: nkeynes@1140: * varying vec4 gl_Color; nkeynes@1140: * varying vec4 gl_SecondaryColor; nkeynes@1140: * varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords nkeynes@1140: * varying float gl_FogFragCoord; nkeynes@1140: * varying vec2 gl_PointCoord; nkeynes@1140: * nkeynes@1140: * Fragme shader output variables: nkeynes@1140: * vec4 gl_FragCoord; nkeynes@1140: * bool gl_FrontFacing; nkeynes@1140: * vec4 gl_FragColor; nkeynes@1140: * vec4 gl_FragData[gl_MaxDrawBuffers]; nkeynes@1140: * float gl_FragDepth; nkeynes@1140: nkeynes@1140: */ nkeynes@1240: #include "../config.h" nkeynes@1140: nkeynes@1130: #vertex DEFAULT_VERTEX_SHADER nkeynes@1232: uniform mat4 view_matrix; nkeynes@1232: attribute vec4 in_vertex; nkeynes@1232: attribute vec4 in_colour; nkeynes@1232: attribute vec4 in_colour2; /* rgb = colour, a = fog */ nkeynes@1232: attribute vec4 in_texcoord; /* uv = coord, z = palette, w = mode */ nkeynes@1232: nkeynes@1232: varying vec4 frag_colour; nkeynes@1232: varying vec4 frag_colour2; nkeynes@1232: varying vec4 frag_texcoord; nkeynes@1130: void main() nkeynes@1130: { nkeynes@1232: vec4 tmp = view_matrix * in_vertex; nkeynes@1232: float w = in_vertex.z; nkeynes@1130: gl_Position = tmp * w; nkeynes@1232: frag_colour = in_colour; nkeynes@1232: frag_colour2 = in_colour2; nkeynes@1232: frag_texcoord = in_texcoord; nkeynes@1130: } nkeynes@1130: nkeynes@1130: #fragment DEFAULT_FRAGMENT_SHADER nkeynes@1250: precision mediump float; nkeynes@1232: uniform float alpha_ref; nkeynes@1140: uniform sampler2D primary_texture; nkeynes@1221: uniform sampler2D palette_texture; nkeynes@1232: uniform vec3 fog_colour1; nkeynes@1232: uniform vec3 fog_colour2; nkeynes@1232: varying vec4 frag_colour; nkeynes@1232: varying vec4 frag_colour2; nkeynes@1232: varying vec4 frag_texcoord; nkeynes@1140: nkeynes@1130: void main() nkeynes@1130: { nkeynes@1232: vec4 tex = texture2D( primary_texture, frag_texcoord.xy ); nkeynes@1232: if( frag_texcoord.z >= 0.0 ) { nkeynes@1232: tex = texture2D( palette_texture, vec2(frag_texcoord.z + (tex.a*0.249023), 0.5) ); nkeynes@1140: } nkeynes@1140: /* HACK: unfortunately we have to maintain compatibility with GLSL 1.20, nkeynes@1140: * which only supports varying float. So since we're propagating texcoord nkeynes@1140: * anyway, overload the last component to indicate texture mode. nkeynes@1140: */ nkeynes@1232: vec3 main_colour; nkeynes@1232: if( frag_texcoord.w == 0.0 ) { nkeynes@1232: main_colour = frag_colour.rgb * tex.rgb + frag_colour2.rgb; nkeynes@1232: gl_FragColor.a = frag_colour.a * tex.a; nkeynes@1232: } else if( frag_texcoord.w >= 1.5 ) { nkeynes@1232: main_colour = frag_colour.rgb; nkeynes@1232: gl_FragColor.a = frag_colour.a; nkeynes@1140: } else { nkeynes@1232: main_colour = mix(frag_colour.rgb,tex.rgb,tex.a) + frag_colour2.rgb; nkeynes@1232: gl_FragColor.a = frag_colour.a; nkeynes@1140: } nkeynes@1232: if( gl_FragColor.a < alpha_ref ) { nkeynes@1232: discard; nkeynes@1232: } else { nkeynes@1232: if( frag_colour2.a >= 0.0 ) { nkeynes@1232: gl_FragColor.rgb = mix( main_colour, fog_colour1, frag_colour2.a ); nkeynes@1232: } else { nkeynes@1232: gl_FragColor.rgb = mix( main_colour, fog_colour2, -frag_colour2.a ); nkeynes@1232: } nkeynes@1232: } nkeynes@1130: } nkeynes@1130: nkeynes@1207: #program pvr2_shader = DEFAULT_VERTEX_SHADER DEFAULT_FRAGMENT_SHADER nkeynes@1240: nkeynes@1240: #ifndef HAVE_OPENGL_FIXEDFUNC nkeynes@1240: /* In this case we also need a basic shader to actually display the output */ nkeynes@1240: #vertex BASIC_VERTEX_SHADER nkeynes@1240: uniform mat4 view_matrix; nkeynes@1240: attribute vec2 in_vertex; nkeynes@1240: attribute vec4 in_colour; nkeynes@1240: attribute vec2 in_texcoord; /* uv = coord, z = palette, w = mode */ nkeynes@1240: nkeynes@1240: varying vec4 frag_colour; nkeynes@1240: varying vec2 frag_texcoord; nkeynes@1240: void main() nkeynes@1240: { nkeynes@1250: gl_Position = view_matrix * vec4(in_vertex.x,in_vertex.y,0.0,1.0); nkeynes@1240: frag_colour = in_colour; nkeynes@1240: frag_texcoord = in_texcoord; nkeynes@1240: } nkeynes@1240: nkeynes@1240: #fragment BASIC_FRAGMENT_SHADER nkeynes@1250: precision mediump float; nkeynes@1240: uniform sampler2D primary_texture; nkeynes@1240: varying vec4 frag_colour; nkeynes@1240: varying vec2 frag_texcoord; nkeynes@1240: nkeynes@1240: void main() nkeynes@1240: { nkeynes@1240: vec4 tex = texture2D( primary_texture, frag_texcoord.xy ); nkeynes@1240: gl_FragColor.rgb = mix( frag_colour.rgb, tex.rgb, frag_colour.a ); nkeynes@1240: } nkeynes@1240: nkeynes@1240: #program basic_shader = BASIC_VERTEX_SHADER BASIC_FRAGMENT_SHADER nkeynes@1240: #endif