667 |
khor |
1 |
/* ----------------------------------------------------------------------- *
|
|
|
2 |
* This file is part of GEL, http://www.imm.dtu.dk/GEL
|
|
|
3 |
* Copyright (C) the authors and DTU Informatics
|
|
|
4 |
* For license and list of authors, see ../../doc/intro.pdf
|
|
|
5 |
* ----------------------------------------------------------------------- */
|
|
|
6 |
|
|
|
7 |
#include <iostream>
|
|
|
8 |
#include "../GLGraphics/glsl_shader.h"
|
|
|
9 |
#include "SinglePassWireframeRenderer.h"
|
|
|
10 |
|
|
|
11 |
using namespace CGLA;
|
|
|
12 |
using namespace std;
|
|
|
13 |
using namespace GLGraphics;
|
|
|
14 |
|
|
|
15 |
namespace
|
|
|
16 |
{
|
|
|
17 |
const string vp =
|
|
|
18 |
"#version 120\n"
|
|
|
19 |
"#extension GL_EXT_gpu_shader4 : enable\n"
|
|
|
20 |
"varying vec4 diffuseIn;\n"
|
|
|
21 |
"void main(void)\n"
|
|
|
22 |
"{\n"
|
|
|
23 |
" float ndot = dot(gl_NormalMatrix*gl_Normal,vec3(0,0,1));\n"
|
|
|
24 |
" diffuseIn = vec4(0.7,0.9,1,1) * abs(ndot);\n"
|
|
|
25 |
" gl_Position = ftransform();\n"
|
|
|
26 |
"}\n";
|
|
|
27 |
|
|
|
28 |
const string gp =
|
|
|
29 |
"#version 120\n"
|
|
|
30 |
"#extension GL_EXT_gpu_shader4 : enable\n"
|
|
|
31 |
"#extension GL_EXT_geometry_shader4 : enable\n"
|
|
|
32 |
"\n"
|
|
|
33 |
"uniform vec2 WIN_SCALE;\n"
|
|
|
34 |
"varying in vec4 diffuseIn[3];\n"
|
|
|
35 |
"varying vec4 diffuse;\n"
|
|
|
36 |
"noperspective varying vec3 dist;\n"
|
|
|
37 |
"void main(void)\n"
|
|
|
38 |
"{\n"
|
|
|
39 |
" vec2 p0 = WIN_SCALE * gl_PositionIn[0].xy/gl_PositionIn[0].w;\n"
|
|
|
40 |
" vec2 p1 = WIN_SCALE * gl_PositionIn[1].xy/gl_PositionIn[1].w;\n"
|
|
|
41 |
" vec2 p2 = WIN_SCALE * gl_PositionIn[2].xy/gl_PositionIn[2].w;\n"
|
|
|
42 |
" \n"
|
|
|
43 |
" vec2 v0 = p2-p1;\n"
|
|
|
44 |
" vec2 v1 = p2-p0;\n"
|
|
|
45 |
" vec2 v2 = p1-p0;\n"
|
|
|
46 |
" float area = abs(v1.x*v2.y - v1.y * v2.x);\n"
|
|
|
47 |
"\n"
|
|
|
48 |
" dist = vec3(area/length(v0),0,0);\n"
|
|
|
49 |
" gl_Position = gl_PositionIn[0];\n"
|
|
|
50 |
" diffuse = diffuseIn[0];\n"
|
|
|
51 |
" EmitVertex();\n"
|
|
|
52 |
" \n"
|
|
|
53 |
" dist = vec3(0,area/length(v1),0);\n"
|
|
|
54 |
" gl_Position = gl_PositionIn[1];\n"
|
|
|
55 |
" diffuse = diffuseIn[1];\n"
|
|
|
56 |
" EmitVertex();\n"
|
|
|
57 |
"\n"
|
|
|
58 |
" dist = vec3(0,0,area/length(v2));\n"
|
|
|
59 |
" gl_Position = gl_PositionIn[2];\n"
|
|
|
60 |
" diffuse = diffuseIn[2];\n"
|
|
|
61 |
" EmitVertex();\n"
|
|
|
62 |
"\n"
|
|
|
63 |
" EndPrimitive();\n"
|
|
|
64 |
"}\n";
|
|
|
65 |
|
|
|
66 |
const string fp =
|
|
|
67 |
"#version 120\n"
|
|
|
68 |
"#extension GL_EXT_gpu_shader4 : enable\n"
|
|
|
69 |
"\n"
|
|
|
70 |
"noperspective varying vec3 dist;\n"
|
|
|
71 |
"varying vec4 diffuse;\n"
|
|
|
72 |
"uniform vec4 WIRE_COL;\n"
|
|
|
73 |
"\n"
|
|
|
74 |
"void main(void)\n"
|
|
|
75 |
"{\n"
|
|
|
76 |
" float d = min(dist[0],min(dist[1],dist[2]));\n"
|
|
|
77 |
" // Compute intensity\n"
|
|
|
78 |
"\n"
|
|
|
79 |
" float I = exp2(-2*d*d);\n"
|
|
|
80 |
" gl_FragColor = I*WIRE_COL + (1.0 - I)*diffuse;\n"
|
|
|
81 |
"}\n";
|
|
|
82 |
|
|
|
83 |
}
|
|
|
84 |
|
|
|
85 |
|
|
|
86 |
namespace GLGraphics
|
|
|
87 |
{
|
|
|
88 |
|
|
|
89 |
SinglePassWireframeRenderer::SinglePassWireframeRenderer()
|
|
|
90 |
{
|
|
|
91 |
static bool was_here = false;
|
|
|
92 |
if(!was_here)
|
|
|
93 |
{
|
|
|
94 |
was_here = true;
|
|
|
95 |
// Create s haders directly from file
|
|
|
96 |
static GLuint vs = create_glsl_shader(GL_VERTEX_SHADER, vp);
|
|
|
97 |
static GLuint gs = create_glsl_shader(GL_GEOMETRY_SHADER_EXT, gp);
|
|
|
98 |
static GLuint fs = create_glsl_shader(GL_FRAGMENT_SHADER, fp);
|
|
|
99 |
|
|
|
100 |
// Create the program
|
|
|
101 |
static GLuint _prog = glCreateProgram();
|
|
|
102 |
prog = _prog;
|
|
|
103 |
|
|
|
104 |
// Attach all shaders
|
|
|
105 |
if(vs) glAttachShader(prog, vs);
|
|
|
106 |
if(gs) glAttachShader(prog, gs);
|
|
|
107 |
if(fs) glAttachShader(prog, fs);
|
|
|
108 |
|
|
|
109 |
// Specify input and output for the geometry shader. Note that this must be
|
|
|
110 |
// done before linking the program.
|
|
|
111 |
glProgramParameteriEXT(prog,GL_GEOMETRY_INPUT_TYPE_EXT,GL_TRIANGLES);
|
|
|
112 |
glProgramParameteriEXT(prog,GL_GEOMETRY_VERTICES_OUT_EXT,3);
|
|
|
113 |
glProgramParameteriEXT(prog,GL_GEOMETRY_OUTPUT_TYPE_EXT,GL_TRIANGLE_STRIP);
|
|
|
114 |
|
|
|
115 |
// Link the program object and print out the info log
|
|
|
116 |
glLinkProgram(prog);
|
|
|
117 |
}
|
|
|
118 |
}
|
|
|
119 |
|
|
|
120 |
bool SinglePassWireframeRenderer::enable(const CGLA::Vec3f& line_col)
|
|
|
121 |
{
|
|
|
122 |
GLint o;
|
|
|
123 |
glGetIntegerv(GL_CURRENT_PROGRAM, &o);
|
|
|
124 |
old_prog = o;
|
|
|
125 |
glUseProgram(prog);
|
|
|
126 |
|
|
|
127 |
GLint vpdim[4];
|
|
|
128 |
glGetIntegerv(GL_VIEWPORT,vpdim);
|
|
|
129 |
|
|
|
130 |
// Set the value of a uniform
|
|
|
131 |
glUniform2f(glGetUniformLocation(prog,"WIN_SCALE"),
|
|
|
132 |
static_cast<float>(vpdim[2]/2), static_cast<float>(vpdim[3]/2));
|
|
|
133 |
glUniform4f(glGetUniformLocation(prog,"WIRE_COL"), line_col[0], line_col[1], line_col[2], 0);
|
|
|
134 |
|
|
|
135 |
return true;
|
|
|
136 |
}
|
|
|
137 |
|
|
|
138 |
void SinglePassWireframeRenderer::disable()
|
|
|
139 |
{
|
|
|
140 |
glUseProgram(old_prog);
|
|
|
141 |
}
|
|
|
142 |
|
|
|
143 |
}
|