3 static void shader_ball_link(void);
4 static void shader_ball_register(void);
5 static struct vg_shader _shader_ball
= {
7 .link
= shader_ball_link
,
10 .orig_file
= "shaders/ball.vs.glsl",
12 "layout (location=0) in vec2 a_co;\n"
13 "uniform vec3 uOffset;\n"
16 "out vec4 aTexCoords;\n"
19 " // Vertex transform\n"
20 " vec3 worldpos = vec3( (a_co * 0.5 - 0.25) * uOffset.z + uOffset.xy, 1.0 );\n"
21 " gl_Position = vec4( uPv * worldpos, 1.0 );\n"
23 " // Create texture coords\n"
24 " aTexCoords = vec4( a_co, worldpos.xy );\n"
29 .orig_file
= "shaders/ball.fs.glsl",
31 "out vec4 FragColor;\n"
33 "uniform sampler2D uTexMain;\n"
34 "uniform vec3 uColour;\n"
35 "uniform vec2 uTexOffset;\n"
37 "in vec4 aTexCoords;\n"
40 " vec2 center_coords = aTexCoords.xy - 0.5;\n"
41 " vec2 center_coords_sqr = center_coords*center_coords;\n"
42 " float circle_factor = smoothstep( 0.07, 0.0625, \n"
43 " center_coords_sqr.x+center_coords_sqr.y );\n"
45 " float bulge_amt = center_coords_sqr.x+center_coords_sqr.y;\n"
46 " vec2 warped_coords = aTexCoords.zw+uTexOffset - center_coords;\n"
47 " vec4 noise_sample = texture( uTexMain, warped_coords );\n"
49 " float rim_light = (center_coords_sqr.x+center_coords_sqr.y)*15.0;\n"
51 " vec2 shadow_coords = center_coords + vec2(0.02,0.07);\n"
52 " vec2 shadow_coords_sqr = shadow_coords*shadow_coords;\n"
53 " float shadow = exp(-((shadow_coords_sqr.x+shadow_coords_sqr.y)-0.0125)*15.0);\n"
55 " vec3 marble_comp = uColour*0.6 + \n"
56 " (noise_sample.x*2.7+pow(rim_light,3.0)*2.0) * 0.1;\n"
57 " vec4 colour_comp = mix( vec4(0.0,0.0,0.0,shadow), \n"
58 " vec4(marble_comp,1.0), circle_factor );\n"
59 " FragColor = colour_comp;\n"
64 static GLuint _uniform_ball_uOffset
;
65 static GLuint _uniform_ball_uPv
;
66 static GLuint _uniform_ball_uTexMain
;
67 static GLuint _uniform_ball_uColour
;
68 static GLuint _uniform_ball_uTexOffset
;
69 static void shader_ball_uOffset(v3f
const v
){
70 glUniform3fv(_uniform_ball_uOffset
,1,v
);
72 static void shader_ball_uPv(m3x3f m
){
73 glUniformMatrix3fv(_uniform_ball_uPv
,1,GL_FALSE
,(float*)m
);
75 static void shader_ball_uTexMain(int i
){
76 glUniform1i(_uniform_ball_uTexMain
,i
);
78 static void shader_ball_uColour(v3f
const v
){
79 glUniform3fv(_uniform_ball_uColour
,1,v
);
81 static void shader_ball_uTexOffset(v2f
const v
){
82 glUniform2fv(_uniform_ball_uTexOffset
,1,v
);
84 static void shader_ball_register(void){
85 vg_shader_register( &_shader_ball
);
87 static void shader_ball_use(void){ glUseProgram(_shader_ball
.id
); }
88 static void shader_ball_link(void){
89 _uniform_ball_uOffset
= glGetUniformLocation( _shader_ball
.id
, "uOffset" );
90 _uniform_ball_uPv
= glGetUniformLocation( _shader_ball
.id
, "uPv" );
91 _uniform_ball_uTexMain
= glGetUniformLocation( _shader_ball
.id
, "uTexMain" );
92 _uniform_ball_uColour
= glGetUniformLocation( _shader_ball
.id
, "uColour" );
93 _uniform_ball_uTexOffset
= glGetUniformLocation( _shader_ball
.id
, "uTexOffset" );
95 #endif /* SHADER_ball_H */