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@1140: nkeynes@1140: nkeynes@1130: #vertex DEFAULT_VERTEX_SHADER nkeynes@1130: void main() nkeynes@1130: { nkeynes@1130: vec4 tmp = ftransform(); nkeynes@1130: float w = gl_Vertex.z; nkeynes@1130: gl_Position = tmp * w; nkeynes@1130: gl_FrontColor = gl_Color; nkeynes@1130: gl_FrontSecondaryColor = gl_SecondaryColor; nkeynes@1130: gl_TexCoord[0] = gl_MultiTexCoord0; nkeynes@1130: gl_FogFragCoord = gl_FogCoord; nkeynes@1130: } nkeynes@1130: nkeynes@1130: #fragment DEFAULT_FRAGMENT_SHADER nkeynes@1140: nkeynes@1140: uniform sampler2D primary_texture; nkeynes@1221: uniform sampler2D palette_texture; nkeynes@1140: nkeynes@1130: void main() nkeynes@1130: { nkeynes@1140: vec4 tex = texture2D( primary_texture, gl_TexCoord[0].xy ); nkeynes@1140: if( gl_TexCoord[0].z >= 0.0 ) { nkeynes@1221: tex = texture2D( palette_texture, vec2(gl_TexCoord[0].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@1140: if( gl_TexCoord[0].w == 0.0 ) { nkeynes@1140: gl_FragColor.rgb = mix( gl_Color.rgb * tex.rgb + gl_SecondaryColor.rgb, gl_Fog.color.rgb, gl_FogFragCoord ); nkeynes@1140: gl_FragColor.a = gl_Color.a * tex.a; nkeynes@1140: } else if( gl_TexCoord[0].w >= 1.5 ) { nkeynes@1140: gl_FragColor.rgb = mix( gl_Color.rgb, gl_Fog.color.rgb, gl_FogFragCoord ); nkeynes@1140: gl_FragColor.a = gl_Color.a; nkeynes@1140: } else { nkeynes@1140: gl_FragColor.rgb = mix( mix(gl_Color.rgb,tex.rgb,tex.a) + gl_SecondaryColor.rgb, gl_Fog.color.rgb, gl_FogFragCoord); nkeynes@1140: gl_FragColor.a = gl_Color.a; nkeynes@1140: } nkeynes@1130: gl_FragDepth = gl_FragCoord.z; nkeynes@1130: } nkeynes@1130: nkeynes@1207: #program pvr2_shader = DEFAULT_VERTEX_SHADER DEFAULT_FRAGMENT_SHADER nkeynes@1130: