Search
lxdream.org :: lxdream/src/pvr2/shaders.glsl
lxdream 0.9.1
released Jun 29
Download Now
filename src/pvr2/shaders.glsl
changeset 1207:f7ca985659c6
prev1140:7dc1c71ece76
next1221:f50407acc682
author nkeynes
date Mon Feb 13 21:43:22 2012 +1000 (12 years ago)
permissions -rw-r--r--
last change Remove unused pvr2_poly_texblend array
Support GL_MAX_TEXTURE_UNITS and GL_MAX_IMAGE_TEXTURE_UNITS
Protected against undefined GL_STACK_OVERFLOW
file annotate diff log raw
nkeynes@1130
     1
/**
nkeynes@1130
     2
 * $Id$
nkeynes@1130
     3
 *
nkeynes@1130
     4
 * Assorted shader definitions (optionally) used by the PVR2 rendering
nkeynes@1130
     5
 * engine.
nkeynes@1130
     6
 * 
nkeynes@1130
     7
 * This file is preprocessed by genglsl to produce shaders.c and shaders.h.
nkeynes@1130
     8
 *
nkeynes@1130
     9
 * Copyright (c) 2007-2010 Nathan Keynes.
nkeynes@1130
    10
 *
nkeynes@1130
    11
 * This program is free software; you can redistribute it and/or modify
nkeynes@1130
    12
 * it under the terms of the GNU General Public License as published by
nkeynes@1130
    13
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@1130
    14
 * (at your option) any later version.
nkeynes@1130
    15
 *
nkeynes@1130
    16
 * This program is distributed in the hope that it will be useful,
nkeynes@1130
    17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@1130
    18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@1130
    19
 * GNU General Public License for more details.
nkeynes@1130
    20
 */
nkeynes@1130
    21
nkeynes@1140
    22
/**
nkeynes@1140
    23
 * Quick reference for predefined variables
nkeynes@1140
    24
 
nkeynes@1140
    25
 * Vertex shader input variables:
nkeynes@1140
    26
 *   vec4 gl_Color;
nkeynes@1140
    27
 *   vec4 gl_SecondaryColor;
nkeynes@1140
    28
 *   vec3 gl_Normal;
nkeynes@1140
    29
 *   vec4 gl_Vertex;
nkeynes@1140
    30
 *   vec4 gl_MultiTexCoord0;
nkeynes@1140
    31
 *   vec4 gl_MultiTexCoord1; 
nkeynes@1140
    32
 *   vec4 gl_MultiTexCoord2;
nkeynes@1140
    33
 *   vec4 gl_MultiTexCoord3; 
nkeynes@1140
    34
 *   vec4 gl_MultiTexCoord4;
nkeynes@1140
    35
 *   vec4 gl_MultiTexCoord5;
nkeynes@1140
    36
 *   vec4 gl_MultiTexCoord6;
nkeynes@1140
    37
 *   vec4 gl_MultiTexCoord7;
nkeynes@1140
    38
 *   float gl_FogCoord;
nkeynes@1140
    39
 *
nkeynes@1140
    40
 * Vertex shader output variables:
nkeynes@1140
    41
 *   vec4 gl_Position;    // must be written to
nkeynes@1140
    42
 *   float gl_PointSize;  // may be written to
nkeynes@1140
    43
 *   vec4 gl_ClipVertex;  // may be written to
nkeynes@1140
    44
 *   varying vec4 gl_FrontColor; 
nkeynes@1140
    45
 *   varying vec4 gl_BackColor; 
nkeynes@1140
    46
 *   varying vec4 gl_FrontSecondaryColor; 
nkeynes@1140
    47
 *   varying vec4 gl_BackSecondaryColor; 
nkeynes@1140
    48
 *   varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords
nkeynes@1140
    49
 *   varying float gl_FogFragCoord;
nkeynes@1140
    50
 *
nkeynes@1140
    51
 * Fragment shader input variables:
nkeynes@1140
    52
 *   varying vec4 gl_Color; 
nkeynes@1140
    53
 *   varying vec4 gl_SecondaryColor; 
nkeynes@1140
    54
 *   varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords
nkeynes@1140
    55
 *   varying float gl_FogFragCoord;
nkeynes@1140
    56
 *   varying vec2 gl_PointCoord;
nkeynes@1140
    57
 *
nkeynes@1140
    58
 * Fragme shader output variables:
nkeynes@1140
    59
 *   vec4 gl_FragCoord; 
nkeynes@1140
    60
 *   bool gl_FrontFacing; 
nkeynes@1140
    61
 *   vec4 gl_FragColor; 
nkeynes@1140
    62
 *   vec4 gl_FragData[gl_MaxDrawBuffers]; 
nkeynes@1140
    63
 *   float gl_FragDepth;
nkeynes@1140
    64
nkeynes@1140
    65
 */
nkeynes@1140
    66
nkeynes@1140
    67
nkeynes@1130
    68
#vertex DEFAULT_VERTEX_SHADER
nkeynes@1130
    69
void main()
nkeynes@1130
    70
{
nkeynes@1130
    71
    vec4 tmp = ftransform();
nkeynes@1130
    72
    float w = gl_Vertex.z;
nkeynes@1130
    73
    gl_Position  = tmp * w;
nkeynes@1130
    74
    gl_FrontColor = gl_Color;
nkeynes@1130
    75
    gl_FrontSecondaryColor = gl_SecondaryColor;
nkeynes@1130
    76
    gl_TexCoord[0] = gl_MultiTexCoord0;
nkeynes@1130
    77
    gl_FogFragCoord = gl_FogCoord;
nkeynes@1130
    78
}
nkeynes@1130
    79
nkeynes@1130
    80
#fragment DEFAULT_FRAGMENT_SHADER
nkeynes@1140
    81
nkeynes@1140
    82
uniform sampler2D primary_texture;
nkeynes@1140
    83
uniform sampler1D palette_texture;
nkeynes@1140
    84
nkeynes@1130
    85
void main()
nkeynes@1130
    86
{
nkeynes@1140
    87
	vec4 tex = texture2D( primary_texture, gl_TexCoord[0].xy );
nkeynes@1140
    88
	if( gl_TexCoord[0].z >= 0.0 ) {
nkeynes@1140
    89
	    tex = texture1D( palette_texture, gl_TexCoord[0].z + (tex.a*0.249023) );
nkeynes@1140
    90
	}
nkeynes@1140
    91
	/* HACK: unfortunately we have to maintain compatibility with GLSL 1.20,
nkeynes@1140
    92
	 * which only supports varying float. So since we're propagating texcoord
nkeynes@1140
    93
	 * anyway, overload the last component to indicate texture mode. 
nkeynes@1140
    94
	 */
nkeynes@1140
    95
	if( gl_TexCoord[0].w == 0.0 ) {
nkeynes@1140
    96
	    gl_FragColor.rgb = mix( gl_Color.rgb * tex.rgb + gl_SecondaryColor.rgb, gl_Fog.color.rgb, gl_FogFragCoord );
nkeynes@1140
    97
	    gl_FragColor.a = gl_Color.a * tex.a;
nkeynes@1140
    98
	} else if( gl_TexCoord[0].w >= 1.5 ) {
nkeynes@1140
    99
	    gl_FragColor.rgb = mix( gl_Color.rgb, gl_Fog.color.rgb, gl_FogFragCoord );
nkeynes@1140
   100
	    gl_FragColor.a = gl_Color.a;
nkeynes@1140
   101
	} else {
nkeynes@1140
   102
	    gl_FragColor.rgb = mix( mix(gl_Color.rgb,tex.rgb,tex.a) + gl_SecondaryColor.rgb, gl_Fog.color.rgb, gl_FogFragCoord);
nkeynes@1140
   103
	    gl_FragColor.a = gl_Color.a;
nkeynes@1140
   104
	}
nkeynes@1130
   105
	gl_FragDepth = gl_FragCoord.z;
nkeynes@1130
   106
}
nkeynes@1130
   107
nkeynes@1207
   108
#program pvr2_shader = DEFAULT_VERTEX_SHADER DEFAULT_FRAGMENT_SHADER
nkeynes@1130
   109
.