MRPT  1.9.9
DefaultShaders.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | https://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2020, Individual contributors, see AUTHORS file |
6  | See: https://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See: https://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "opengl-precomp.h" // Precompiled header
11 
13 #include <mrpt/opengl/opengl_api.h>
14 
15 using namespace mrpt::opengl;
16 
17 // TODO: May be, allow users to register custom shaders?
18 
20 {
21 #if MRPT_HAS_OPENGL_GLUT
22 
23  // Vertex shader:
24  const char* vertex_shader = nullptr;
25  const char* fragment_shader = nullptr;
26  std::vector<std::string> attribs, uniforms;
27 
28  switch (id)
29  {
31  vertex_shader =
32 #include "../shaders/points.v.glsl"
33  ;
34  fragment_shader =
35 #include "../shaders/points.f.glsl"
36  ;
37  uniforms = {"p_matrix",
38  "mv_matrix",
39  "vertexPointSize",
40  "enableVariablePointSize",
41  "variablePointSize_K",
42  "variablePointSize_DepthScale"};
43  attribs = {"position", "vertexColor"};
44  break;
45 
46  // ==============================
48  vertex_shader =
49 #include "../shaders/wireframe.v.glsl"
50  ;
51  fragment_shader =
52 #include "../shaders/wireframe.f.glsl"
53  ;
54  uniforms = {"p_matrix", "mv_matrix"};
55  attribs = {"position", "vertexColor"};
56  break;
57 
58  // ==============================
60  vertex_shader =
61 #include "../shaders/triangles.v.glsl"
62  ;
63  fragment_shader =
64 #include "../shaders/triangles.f.glsl"
65  ;
66  uniforms = {"p_matrix", "mv_matrix", "light_diffuse",
67  "light_ambient", "light_specular", "light_direction"};
68  attribs = {"position", "vertexColor", "vertexNormal"};
69  break;
70  // ==============================
72  vertex_shader =
73 #include "../shaders/textured-triangles.v.glsl"
74  ;
75  fragment_shader =
76 #include "../shaders/textured-triangles.f.glsl"
77  ;
78  uniforms = {"p_matrix", "mv_matrix", "pmv_matrix",
79  "light_diffuse", "light_ambient", "light_specular",
80  "light_direction", "textureSampler", "enableLight"};
81  attribs = {"position", "vertexUV", "vertexNormal"};
82  break;
83  // ==============================
85  vertex_shader =
86 #include "../shaders/text.v.glsl"
87  ;
88  fragment_shader =
89 #include "../shaders/text.f.glsl"
90  ;
91  uniforms = {"p_matrix", "mv_matrix"};
92  attribs = {"position", "vertexColor"};
93  break;
94 
95  default:
97  "Unknown shader_id_t=%u", static_cast<unsigned>(id));
98  };
99 
100  // Init GLEW if not already done:
101 #ifdef _WIN32
102  glewInit();
103 #endif
104 
105  auto shader = std::make_shared<Program>();
106 
107  std::string errMsgs;
108  std::vector<Shader> lstShaders;
109  lstShaders.resize(2);
110  if (!lstShaders[0].compile(GL_VERTEX_SHADER, vertex_shader, errMsgs))
111  {
113  "Error compiling GL_VERTEX_SHADER:\n%s", errMsgs.c_str());
114  }
115  if (!lstShaders[1].compile(GL_FRAGMENT_SHADER, fragment_shader, errMsgs))
116  {
118  "Error compiling GL_FRAGMENT_SHADER:\n%s", errMsgs.c_str());
119  }
120  if (!shader->linkProgram(lstShaders, errMsgs))
121  {
123  "Error linking Opengl Shader programs:\n%s", errMsgs.c_str());
124  }
125 
126 #if 0
127  // Debug:
128  std::cout << "Built Shader program #" << int(id) << "\n";
129  shader->dumpProgramDescription(std::cout);
130  std::cout << "\n";
131 #endif
132 
133  // Uniforms:
134  for (const auto& name : uniforms) shader->declareUniform(name);
135 
136  // Attributes:
137  for (const auto& name : attribs) shader->declareAttribute(name);
138 
139  return shader;
140 #else
141  THROW_EXCEPTION("MRPT built without OpenGL support.");
142 #endif
143 }
static constexpr shader_id_t TEXTURED_TRIANGLES
#define THROW_EXCEPTION(msg)
Definition: exceptions.h:67
static constexpr shader_id_t TEXT
static constexpr shader_id_t WIREFRAME
uint8_t shader_id_t
Type for IDs of shaders.
Definition: Shader.h:23
static constexpr shader_id_t TRIANGLES
Program::Ptr LoadDefaultShader(const shader_id_t id)
Loads a set of OpenGL Vertex+Fragment shaders from the default library available in mrpt::opengl...
The namespace for 3D scene representation and rendering.
Definition: CGlCanvasBase.h:13
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
Definition: exceptions.h:69
static constexpr shader_id_t POINTS



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: 3a26b90fd Wed Mar 25 20:17:03 2020 +0100 at miƩ mar 25 23:05:41 CET 2020