GEOMETRY SHADER ------------------------------------------------------------------ #version 120 //in values from vert shader... varying in vec2 vSpriteTransform[]; varying in vec4 vSpriteColor[]; varying in vec4 vSpriteTexCoords[]; //out values to frag shader... varying out vec2 TexCoord; varying out vec4 Color; void main() { mat4 gVP = gl_ModelViewProjectionMatrix; vec2 pos = gl_PositionIn[0].xy; vec2 size = vSpriteTransform[0].xy; vec4 tex = vSpriteTexCoords[0]; //out to frag... Color = vSpriteColor[0]; gl_Position = gVP * vec4(pos.x, pos.y, 0, 1); //top left TexCoord = vec2(tex.x, tex.y); EmitVertex(); gl_Position = gVP * vec4(pos.x+size.x, pos.y, 0, 1); //top right TexCoord = vec2(tex.x+tex.z, tex.y); EmitVertex(); gl_Position = gVP * vec4(pos.x, pos.y+size.y, 0, 1); //bottom left TexCoord = vec2(tex.x, tex.y+tex.w); EmitVertex(); gl_Position = gVP * vec4(pos.x+size.x, pos.y+size.y, 0, 1); //bottom right TexCoord = vec2(tex.x+tex.z, tex.y+tex.w); EmitVertex(); EndPrimitive(); } VERTEX SHADER ------------------------------------------------------------------ #version 120 //in values... attribute vec2 SpriteTransform; attribute vec4 SpriteTexCoords; attribute vec4 SpriteColor; //out values... varying vec2 vSpriteTransform; varying vec4 vSpriteColor; varying vec4 vSpriteTexCoords; void main() { vSpriteTransform = SpriteTransform; vSpriteTexCoords = SpriteTexCoords; vSpriteColor = SpriteColor; gl_Position = gl_Vertex; } FRAGMENT SHADER ------------------------------------------------------------------ #version 120 uniform sampler2D tex0; varying vec2 TexCoord; varying vec4 Color; void main(void) { vec4 c = texture2D(tex0, TexCoord); gl_FragColor = Color * c; }