57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
#version 150
 | 
						|
 | 
						|
// The render target's resolution (used for scaling)
 | 
						|
uniform vec2 resolution;
 | 
						|
 | 
						|
// The billboards' size
 | 
						|
uniform vec2 size;
 | 
						|
 | 
						|
// Input is the passed point cloud
 | 
						|
layout (points) in;
 | 
						|
 | 
						|
// The output will consist of triangle strips with four vertices each
 | 
						|
layout (triangle_strip, max_vertices = 4) out;
 | 
						|
 | 
						|
// Output texture coordinates
 | 
						|
out vec2 tex_coord;
 | 
						|
 | 
						|
// Main entry point
 | 
						|
void main()
 | 
						|
{
 | 
						|
    // Caculate the half width/height of the billboards
 | 
						|
    vec2 half_size = size / 2.f;
 | 
						|
 | 
						|
    // Scale the size based on resolution (1 would be full width/height)
 | 
						|
    half_size /= resolution;
 | 
						|
 | 
						|
    // Iterate over all vertices
 | 
						|
    for (int i = 0; i < gl_in.length(); i++)
 | 
						|
    {
 | 
						|
        // Retrieve the passed vertex position
 | 
						|
        vec2 pos = gl_in[i].gl_Position.xy;
 | 
						|
 | 
						|
        // Bottom left vertex
 | 
						|
        gl_Position = vec4(pos - half_size, 0.f, 1.f);
 | 
						|
        tex_coord = vec2(1.f, 1.f);
 | 
						|
        EmitVertex();
 | 
						|
 | 
						|
        // Bottom right vertex
 | 
						|
        gl_Position = vec4(pos.x + half_size.x, pos.y - half_size.y, 0.f, 1.f);
 | 
						|
        tex_coord = vec2(0.f, 1.f);
 | 
						|
        EmitVertex();
 | 
						|
 | 
						|
        // Top left vertex
 | 
						|
        gl_Position = vec4(pos.x - half_size.x, pos.y + half_size.y, 0.f, 1.f);
 | 
						|
        tex_coord = vec2(1.f, 0.f);
 | 
						|
        EmitVertex();
 | 
						|
 | 
						|
        // Top right vertex
 | 
						|
        gl_Position = vec4(pos + half_size, 0.f, 1.f);
 | 
						|
        tex_coord = vec2(0.f, 0.f);
 | 
						|
        EmitVertex();
 | 
						|
 | 
						|
        // And finalize the primitive
 | 
						|
        EndPrimitive();
 | 
						|
    }
 | 
						|
}
 |