tesspot
annotate sdr/bezier.te.glsl @ 0:72b7f9f2eead
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 02 Dec 2012 08:23:51 +0200 |
parents | |
children | befe01bbd27f |
rev | line source |
---|---|
nuclear@0 | 1 #version 410 compatibility |
nuclear@0 | 2 |
nuclear@0 | 3 layout(quads) in; |
nuclear@0 | 4 |
nuclear@0 | 5 out vec3 normal; |
nuclear@0 | 6 out vec3 vpos; |
nuclear@0 | 7 |
nuclear@0 | 8 vec3 bezier_patch(float u, float v); |
nuclear@0 | 9 vec3 bezier_patch_norm(float u, float v); |
nuclear@0 | 10 float bernstein(int i, float x); |
nuclear@0 | 11 |
nuclear@0 | 12 void main() |
nuclear@0 | 13 { |
nuclear@0 | 14 vec3 pos = bezier_patch(gl_TessCoord.x, gl_TessCoord.y); |
nuclear@0 | 15 normal = gl_NormalMatrix * bezier_patch_norm(gl_TessCoord.x, gl_TessCoord.y); |
nuclear@0 | 16 |
nuclear@0 | 17 gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0); |
nuclear@0 | 18 vpos = (gl_ModelViewMatrix * vec4(pos, 1.0)).xyz; |
nuclear@0 | 19 } |
nuclear@0 | 20 |
nuclear@0 | 21 vec3 bezier_patch(float u, float v) |
nuclear@0 | 22 { |
nuclear@0 | 23 int i, j; |
nuclear@0 | 24 vec3 res = vec3(0.0, 0.0, 0.0); |
nuclear@0 | 25 |
nuclear@0 | 26 for(j=0; j<4; j++) { |
nuclear@0 | 27 for(i=0; i<4; i++) { |
nuclear@0 | 28 float bu = bernstein(i, u); |
nuclear@0 | 29 float bv = bernstein(j, v); |
nuclear@0 | 30 |
nuclear@0 | 31 res += gl_in[j * 4 + i].gl_Position.xyz * bu * bv; |
nuclear@0 | 32 } |
nuclear@0 | 33 } |
nuclear@0 | 34 return res; |
nuclear@0 | 35 } |
nuclear@0 | 36 |
nuclear@0 | 37 #define DT 0.0001 |
nuclear@0 | 38 vec3 bezier_patch_norm(float u, float v) |
nuclear@0 | 39 { |
nuclear@0 | 40 vec3 tang = bezier_patch(u + DT, v) - bezier_patch(u - DT, v); |
nuclear@0 | 41 vec3 bitan = bezier_patch(u, v + DT) - bezier_patch(u, v - DT); |
nuclear@0 | 42 return cross(tang, bitan); |
nuclear@0 | 43 } |
nuclear@0 | 44 |
nuclear@0 | 45 float bernstein(int i, float x) |
nuclear@0 | 46 { |
nuclear@0 | 47 float invx = 1.0 - x; |
nuclear@0 | 48 |
nuclear@0 | 49 if(i == 0) { |
nuclear@0 | 50 return invx * invx * invx; |
nuclear@0 | 51 } |
nuclear@0 | 52 if(i == 1) { |
nuclear@0 | 53 return 3 * x * invx * invx; |
nuclear@0 | 54 } |
nuclear@0 | 55 if(i == 2) { |
nuclear@0 | 56 return 3 * x * x * invx; |
nuclear@0 | 57 } |
nuclear@0 | 58 return x * x * x; |
nuclear@0 | 59 } |