Add clipbox management in flat_shader

This commit is contained in:
Maxime Gimeno 2017-09-19 12:29:08 +02:00
parent bac0452224
commit de7999ce09
3 changed files with 42 additions and 2 deletions

View File

@ -5,6 +5,7 @@ in GS_OUT
vec4 fP;
flat vec3 normal;
flat vec4 color;
float dist[6];
} fs_in;
uniform bool is_two_side;
@ -13,11 +14,20 @@ uniform vec4 light_diff;
uniform vec4 light_spec;
uniform vec4 light_amb;
uniform float spec_power ;
uniform bool is_clipbox_on;
out vec4 out_color;
void main(void)
{
if(is_clipbox_on)
if(fs_in.dist[0]>0 ||
fs_in.dist[1]>0 ||
fs_in.dist[2]>0 ||
fs_in.dist[3]>0 ||
fs_in.dist[4]>0 ||
fs_in.dist[5]>0)
discard;
vec3 L = light_pos.xyz - fs_in.fP.xyz;
vec3 V = -fs_in.fP.xyz;

View File

@ -8,6 +8,7 @@ in VS_OUT
vec4 fP;
vec3 normal;
vec4 out_color;
float dist[6];
} gs_in[3];
out GS_OUT
@ -15,6 +16,7 @@ out GS_OUT
vec4 fP;
flat vec3 normal;
flat vec4 color;
float dist[6];
} gs_out;
uniform mat4 mv_matrix;
@ -24,11 +26,14 @@ void main(void)
gl_Position = gl_in[0].gl_Position;
gs_out.fP = gs_in[0].fP;
for(int i=0; i< 6; ++i)
gs_out.dist[i] = gs_in[0].dist[i];
EmitVertex();
gl_Position = gl_in[1].gl_Position;
gs_out.fP = gs_in[1].fP;
for(int i=0; i< 6; ++i)
gs_out.dist[i] = gs_in[1].dist[i];
EmitVertex();
gl_Position = gl_in[2].gl_Position;
@ -45,6 +50,9 @@ EmitVertex();
gs_out.normal = mat3(mv_matrix)* normal;
gs_out.color = gs_in[2].out_color;
for(int i=0; i< 6; ++i)
gs_out.dist[i] = gs_in[2].dist[i];
EmitVertex();
EndPrimitive();

View File

@ -3,19 +3,41 @@
in vec4 vertex;
in vec3 normals;
in vec4 colors;
out VS_OUT
{
vec4 fP;
vec3 normal;
vec4 out_color;
float dist[6];
}vs_out;
uniform mat4 mvp_matrix;
uniform mat4 mv_matrix;
uniform bool is_clipbox_on;
uniform highp mat4x4 clipbox1;
uniform highp mat4x4 clipbox2;
void compute_distances(void)
{
for(int i=0; i<3; ++i)
{
vs_out.dist[i]=
clipbox1[i][0]*vertex.x+
clipbox1[i][1]*vertex.y+
clipbox1[i][2]*vertex.z +
clipbox1[i][3];
vs_out.dist[i+3]=
clipbox2[i][0]*vertex.x+
clipbox2[i][1]*vertex.y+
clipbox2[i][2]*vertex.z +
clipbox2[i][3];
}
}
void main(void)
{
if(is_clipbox_on)
compute_distances();
vs_out.out_color=colors;
vs_out.fP = mv_matrix * vertex;
vs_out.normal = normals;