Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/OpenGL/ImageProcessingProgram.cpp @ 2064:4e31d76c7ecd deep-learning
making ImageProcessingProgram compatible with 3D volumes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 04 May 2023 11:06:19 +0200 |
parents | 6ea5f40ea0e9 |
children | cf3d85eb291c |
rev | line source |
---|---|
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * License along with this program. If not, see |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #include "ImageProcessingProgram.h" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 #include "OpenGLFramebuffer.h" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 #include <OrthancException.h> |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 static const unsigned int DIMENSIONS = 2; // Number of dimensions (we draw in 2D) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 static const unsigned int VERTICES = 6; // 2 triangles in 2D (each triangle has 3 vertices) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 static const float TRIANGLES[DIMENSIONS * VERTICES] = { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 // First triangle |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 -1.0f, -1.0f, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 1.0f, -1.0f, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 -1.0f, 1.0f, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 // Second triangle |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 -1.0f, 1.0f, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 1.0f, -1.0f, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 1.0f, 1.0f |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 }; |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 /** |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 * "varying" indicates variables that are shader by the vertex shader |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 * and the fragment shader. The reason for "v_position" is that |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 * "a_position" (position in the target frame buffer) ranges from -1 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 * to 1, whereas texture samplers range from 0 to 1. |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 **/ |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
53 static const char* VERTEX_SHADER_2D = |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 "in vec2 a_position; \n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 "out vec2 v_position; \n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 "void main() { \n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 " v_position = (a_position + 1.0) / 2.0; \n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 " gl_Position = vec4(a_position, 0, 1.0); \n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 "} \n"; |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
62 /** |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
63 * VERTEX_SHADER_3D allows to sample a 3D texture by introducing the |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
64 * "u_z" uniform whose range is in [0,1] and that allows to scan a 3D |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
65 * texture along its Z axis. |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
66 **/ |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
67 static const char* VERTEX_SHADER_3D = |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
68 "in vec2 a_position; \n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
69 "out vec3 v_position; \n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
70 "uniform float u_z; \n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
71 "void main() { \n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
72 " v_position = vec3((a_position + 1.0) / 2.0, u_z); \n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
73 " gl_Position = vec4(a_position, u_z, 1.0); \n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
74 "} \n"; |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
75 |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
76 |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 namespace OrthancStone |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 namespace OpenGL |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 void ImageProcessingProgram::SetupPosition() |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 glBufferData(GL_ARRAY_BUFFER, sizeof(float) * DIMENSIONS * VERTICES, TRIANGLES, GL_STATIC_DRAW); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 GLint positionLocation = program_.GetAttributeLocation("a_position"); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 glEnableVertexAttribArray(positionLocation); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 ImageProcessingProgram::ImageProcessingProgram(IOpenGLContext& context, |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
92 const std::string& fragmentShader, |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
93 bool addUniformZ) : |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 program_(context), |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 quad_vertexbuffer(0) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 if (context.IsContextLost()) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 "OpenGL context has been lost"); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 context.MakeCurrent(); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 std::string version; |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 #if ORTHANC_ENABLE_WASM == 1 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 /** |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 * "#version 300 es" corresponds to: |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 * - OpenGL ES version 3.0: https://registry.khronos.org/OpenGL-Refpages/es3.0/ |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 * - WebGL version 2.0 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 * - GLSL ES version 3.00.6 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 * - Based on version GLSL version 3.0 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 * |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 * Explanation for "highp": |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 * https://emscripetn.org/docs/optimizing/Optimizing-WebGL.html |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 * https://webglfundamentals.org/webgl/lessons/webgl-qna-when-to-choose-highp--mediump--lowp-in-shaders.html |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 **/ |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 version = ("#version 300 es\n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 "precision highp float;\n" |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 "precision highp sampler2D;\n" |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
122 "precision highp sampler2DArray;\n" |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
123 "precision highp sampler3D;\n"); |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 #else |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 /** |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 * "#version 130" corresponds to: |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 * - OpenGL version 3.0 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 * - GLSL version 1.30.10 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 **/ |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 version = "#version 130\n"; |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 #endif |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
133 std::string vertexShader; |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
134 |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
135 if (addUniformZ) |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
136 { |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
137 vertexShader = version + VERTEX_SHADER_3D; |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
138 } |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
139 else |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
140 { |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
141 vertexShader = version + VERTEX_SHADER_2D; |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
142 } |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
143 |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2061
diff
changeset
|
144 program_.CompileShaders(vertexShader, version + fragmentShader); |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 glGenBuffers(1, &quad_vertexbuffer); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 if (quad_vertexbuffer == 0) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 "Cannot create OpenGL buffer"); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 ImageProcessingProgram::~ImageProcessingProgram() |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 glDeleteBuffers(1, &quad_vertexbuffer); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 void ImageProcessingProgram::Use(OpenGLTexture& target, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 OpenGLFramebuffer& framebuffer, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 bool checkStatus) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 program_.Use(checkStatus); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 framebuffer.SetTarget(target); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 SetupPosition(); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 void ImageProcessingProgram::Use(OpenGLTextureArray& target, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
172 unsigned int targetLayer, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 OpenGLFramebuffer& framebuffer, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 bool checkStatus) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 program_.Use(checkStatus); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 framebuffer.SetTarget(target, targetLayer); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 SetupPosition(); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 void ImageProcessingProgram::Render() |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 glClearColor(0.0, 0.0, 0.0, 1.0); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 glClear(GL_COLOR_BUFFER_BIT); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 #if 1 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 glDrawArrays(GL_TRIANGLES, 0, VERTICES); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 #else |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 // Simpler, but not available in WebGL |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 glBegin(GL_QUADS); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 glVertex2f(-1, 1); // vertex 1 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 glVertex2f(-1, -1); // vertex 2 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 glVertex2f( 1, -1); // vertex 3 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
195 glVertex2f( 1, 1); // vertex 4 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
196 glEnd(); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 #endif |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 ORTHANC_OPENGL_CHECK("glDrawArrays()"); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
200 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
201 } |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 } |