4 * Assorted shader definitions (optionally) used by the PVR2 rendering
7 * This file is preprocessed by genglsl to produce shaders.c and shaders.h.
9 * Copyright (c) 2007-2010 Nathan Keynes.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
23 * Quick reference for predefined variables
25 * Vertex shader input variables:
27 * vec4 gl_SecondaryColor;
30 * vec4 gl_MultiTexCoord0;
31 * vec4 gl_MultiTexCoord1;
32 * vec4 gl_MultiTexCoord2;
33 * vec4 gl_MultiTexCoord3;
34 * vec4 gl_MultiTexCoord4;
35 * vec4 gl_MultiTexCoord5;
36 * vec4 gl_MultiTexCoord6;
37 * vec4 gl_MultiTexCoord7;
40 * Vertex shader output variables:
41 * vec4 gl_Position; // must be written to
42 * float gl_PointSize; // may be written to
43 * vec4 gl_ClipVertex; // may be written to
44 * varying vec4 gl_FrontColor;
45 * varying vec4 gl_BackColor;
46 * varying vec4 gl_FrontSecondaryColor;
47 * varying vec4 gl_BackSecondaryColor;
48 * varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords
49 * varying float gl_FogFragCoord;
51 * Fragment shader input variables:
52 * varying vec4 gl_Color;
53 * varying vec4 gl_SecondaryColor;
54 * varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords
55 * varying float gl_FogFragCoord;
56 * varying vec2 gl_PointCoord;
58 * Fragme shader output variables:
60 * bool gl_FrontFacing;
62 * vec4 gl_FragData[gl_MaxDrawBuffers];
68 #vertex DEFAULT_VERTEX_SHADER
69 uniform mat4 view_matrix;
70 attribute vec4 in_vertex;
71 attribute vec4 in_colour;
72 attribute vec4 in_colour2; /* rgb = colour, a = fog */
73 attribute vec4 in_texcoord; /* uv = coord, z = palette, w = mode */
75 varying vec4 frag_colour;
76 varying vec4 frag_colour2;
77 varying vec4 frag_texcoord;
80 vec4 tmp = view_matrix * in_vertex;
81 float w = in_vertex.z;
82 gl_Position = tmp * w;
83 frag_colour = in_colour;
84 frag_colour2 = in_colour2;
85 frag_texcoord = in_texcoord;
88 #fragment DEFAULT_FRAGMENT_SHADER
90 uniform float alpha_ref;
91 uniform sampler2D primary_texture;
92 uniform sampler2D palette_texture;
93 uniform vec3 fog_colour1;
94 uniform vec3 fog_colour2;
95 varying vec4 frag_colour;
96 varying vec4 frag_colour2;
97 varying vec4 frag_texcoord;
101 vec4 tex = texture2D( primary_texture, frag_texcoord.xy );
102 if( frag_texcoord.z >= 0.0 ) {
103 tex = texture2D( palette_texture, vec2(frag_texcoord.z + (tex.a*0.249023), 0.5) );
105 /* HACK: unfortunately we have to maintain compatibility with GLSL 1.20,
106 * which only supports varying float. So since we're propagating texcoord
107 * anyway, overload the last component to indicate texture mode.
110 if( frag_texcoord.w == 0.0 ) {
111 main_colour = frag_colour.rgb * tex.rgb + frag_colour2.rgb;
112 gl_FragColor.a = frag_colour.a * tex.a;
113 } else if( frag_texcoord.w >= 1.5 ) {
114 main_colour = frag_colour.rgb;
115 gl_FragColor.a = frag_colour.a;
117 main_colour = mix(frag_colour.rgb,tex.rgb,tex.a) + frag_colour2.rgb;
118 gl_FragColor.a = frag_colour.a;
120 if( gl_FragColor.a < alpha_ref ) {
123 if( frag_colour2.a >= 0.0 ) {
124 gl_FragColor.rgb = mix( main_colour, fog_colour1, frag_colour2.a );
126 gl_FragColor.rgb = mix( main_colour, fog_colour2, -frag_colour2.a );
128 gl_FragDepth = gl_FragCoord.z;
132 #program pvr2_shader = DEFAULT_VERTEX_SHADER DEFAULT_FRAGMENT_SHADER
.