libmoldeo (Moldeo 1.0 Core)  1.0
libmoldeo es el conjunto de objetos y funciones, que permiten ejecutar las operaciones básicas de la plataforma Moldeo, y que compone su núcleo.
moShaderGLSL.cpp
Ir a la documentación de este archivo.
1 /*******************************************************************************
2 
3  moShaderGLSL.cpp
4 
5  ****************************************************************************
6  * *
7  * This source is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This code is distributed in the hope that it will be useful, but *
13  * WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
15  * General Public License for more details. *
16  * *
17  * A copy of the GNU General Public License is available on the World *
18  * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
19  * obtain it by writing to the Free Software Foundation, *
20  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  * *
22  ****************************************************************************
23 
24  Copyright (C) 2006 Fabricio Costa
25 
26  Authors:
27  Fabricio Costa
28 
29 
30  Description:
31  Class for GLSL shaders.
32 
33 *******************************************************************************/
34 
35 #include "moShaderGLSL.h"
36 
38 {
40 
41  m_VertexShader = 0;
42  m_FragmentShader = 0;
43  m_GeometryShader = 0;
45  m_ProgramObject = 0;
46 }
47 
49 {
50  Finish();
51 }
52 
54 {
55  return moShader::Init();
56 }
57 
59 {
60  if (m_VertexShader != 0)
61  {
62  glDetachObjectARB(m_ProgramObject, m_VertexShader);
63  m_VertexShader = 0;
64  }
65  if (m_FragmentShader != 0)
66  {
67  glDetachObjectARB(m_ProgramObject, m_FragmentShader);
68  m_FragmentShader = 0;
69  }
70  if (m_GeometryShader != 0)
71  {
72  glDetachObjectARB(m_ProgramObject, m_GeometryShader);
73  m_GeometryShader = 0;
74  }
75 
76  if (m_TesselationShader != 0)
77  {
78  glDetachObjectARB(m_ProgramObject, m_TesselationShader);
80  }
81 
82  if(m_ProgramObject != 0)
83  {
84  glDeleteObjectARB(m_ProgramObject);
85  m_ProgramObject = 0;
86  }
87 
88  return moShader::Finish();
89 }
90 
91 void moShaderGLSL::CreateVertShader(const moText& vert_source)
92 {
93  m_ProgramObject = glCreateProgramObjectARB();
94  compileVertShader(vert_source);
95  linkProgram();
96 }
97 
98 void moShaderGLSL::CreateFragShader(const moText& frag_source)
99 {
100  m_ProgramObject = glCreateProgramObjectARB();
101  compileFragShader(frag_source);
102  linkProgram();
103 }
104 
105 void moShaderGLSL::CreateGeomShader(const moText& geom_source)
106 {
107  m_ProgramObject = glCreateProgramObjectARB();
108  compileGeomShader(geom_source);
109  linkProgram();
110 }
111 
112 void moShaderGLSL::CreateTessShader(const moText& tess_source)
113 {
114  m_ProgramObject = glCreateProgramObjectARB();
115  compileTessShader(tess_source);
116  linkProgram();
117 }
118 
119 void moShaderGLSL::CreateShader( const moText& vert_source, const moText& frag_source)
120 {
121  try {
122  m_ProgramObject = glCreateProgramObjectARB();
123  compileVertShader(vert_source);
124  compileFragShader(frag_source);
125  linkProgram();
126  } catch(...) {
127  cout << "error shader" << endl;
128  }
129 }
130 
131 void moShaderGLSL::CreateShader( const moText& vert_source, const moText& frag_source, const moText& geom_source) {
132  try {
133  m_ProgramObject = glCreateProgramObjectARB();
134  compileVertShader(vert_source);
135  compileFragShader(frag_source);
136  compileGeomShader(geom_source);
137  linkProgram();
138  } catch(...) {
139  cout << "error shader" << endl;
140  }
141 
142 }
143 
144 void moShaderGLSL::CreateShader( const moText& vert_source, const moText& frag_source, const moText& geom_source, const moText& tess_source) {
145  try {
146  m_ProgramObject = glCreateProgramObjectARB();
147  compileVertShader(vert_source);
148  compileFragShader(frag_source);
149  compileGeomShader(geom_source);
150  compileTessShader(tess_source);
151  linkProgram();
152  } catch(...) {
153  cout << "error shader" << endl;
154  }
155 
156 }
157 
158 
159 void moShaderGLSL::LoadVertShader(const moText& vert_filename)
160 {
161  moText vert_source = LoadShaderSource(vert_filename);
162  CreateVertShader(vert_source);
163 }
164 
165 void moShaderGLSL::LoadFragShader(const moText& frag_filename)
166 {
167  moText frag_source = LoadShaderSource(frag_filename);
168  CreateFragShader(frag_source);
169 }
170 
171 void moShaderGLSL::LoadGeomShader(const moText& geom_filename)
172 {
173  moText geom_source = LoadShaderSource(geom_filename);
174  CreateGeomShader(geom_source);
175 }
176 
177 void moShaderGLSL::LoadTessShader(const moText& tess_filename)
178 {
179  moText tess_source = LoadShaderSource(tess_filename);
180  CreateTessShader(tess_source);
181 }
182 
183 
184 void moShaderGLSL::LoadShader(const moText& vert_filename, const moText& frag_filename)
185 {
186  moText vert_source = LoadShaderSource(vert_filename);
187  moText frag_source = LoadShaderSource(frag_filename);
188  CreateShader(vert_source, frag_source);
189 }
190 
191 
192 void moShaderGLSL::LoadShader(const moText& vert_filename, const moText& frag_filename, const moText& geom_filename)
193 {
194  moText vert_source = LoadShaderSource(vert_filename);
195  moText frag_source = LoadShaderSource(frag_filename);
196  moText geom_source = LoadShaderSource(geom_filename);
197  CreateShader(vert_source, frag_source, geom_source);
198 }
199 
200 
201 void moShaderGLSL::LoadShader(const moText& vert_filename, const moText& frag_filename, const moText& geom_filename, const moText& tess_filename)
202 {
203  moText vert_source = LoadShaderSource(vert_filename);
204  moText frag_source = LoadShaderSource(frag_filename);
205  moText geom_source = LoadShaderSource(geom_filename);
206  moText tess_source = LoadShaderSource(tess_filename);
207  CreateShader(vert_source, frag_source, geom_source, tess_source);
208 }
209 
211 {
213  glUseProgramObjectARB(m_ProgramObject);
214 }
215 
217 {
218  glUseProgramObjectARB(0);
220 }
221 
223 {
225 }
226 
228 {
230 }
231 
233 {
235 }
236 
238 {
240 }
241 
243 {
244  //MODebug2->Message("uName:"+uName);
245  return glGetUniformLocationARB(m_ProgramObject, uName);
246 }
247 
249 {
250  return glGetAttribLocationARB(m_ProgramObject, aName);
251 }
252 
253 void moShaderGLSL::compileVertShader(const moText& vert_source)
254 {
255  m_VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
256  const char *source = (const char *)vert_source;
257  const char **psource = &source;
258  cout << "Source:" << source << endl;
259  glShaderSourceARB(m_VertexShader, 1, psource, NULL);
260  glCompileShaderARB(m_VertexShader);
261  cout << "m_VertexShader:" << m_VertexShader << endl;
262  int IsCompiled_FS;
263  int maxLength;
264  GLchar *vertexInfoLog;
265 
266  glGetShaderiv(m_VertexShader, GL_COMPILE_STATUS, &IsCompiled_FS);
267  cout << "Compiled VS:" << IsCompiled_FS << endl;
268  glGetShaderiv(m_VertexShader, GL_INFO_LOG_LENGTH, &maxLength);
269  cout << " maxLength: " << maxLength << endl;
270 
271  /* The maxLength includes the NULL character */
272  vertexInfoLog = new GLchar[maxLength];
273  //vertexInfoLog = {'\0'};
274  //GLchar infoLog[512] = {'\0'};
275 
276  //glGetShaderInfoLog(m_VertexShader, maxLength, &maxLength, vertexInfoLog);
277  if(IsCompiled_FS == MO_FALSE && maxLength)
278  {
279  glGetShaderInfoLog(m_VertexShader, 512, &maxLength, vertexInfoLog);
280  cout << " maxLength: " << maxLength << " infoLog: " << vertexInfoLog << endl;
281  if (MODebug2 != NULL)
282  MODebug2->Error(moText("Vertex Shader compile error:")
283  + "("+GetName()+")"
284  + moText(vertexInfoLog) );
285 
286  /* Handle the error in an appropriate way such as displaying a message or writing to a log file. */
287  /* In this simple program, we'll just leave */
288 
289  //return;
290  } else {
291  MODebug2->Message(moText("Vertex Shader compile log:")
292  + "("+GetName()+")"
293  + moText(vertexInfoLog) );
294  }
295 delete [] vertexInfoLog;
296 
297  glAttachObjectARB(m_ProgramObject, m_VertexShader);
298 }
299 
300 void moShaderGLSL::compileFragShader(const moText& frag_source)
301 {
302  m_FragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
303  const char *source = (const char *)frag_source;
304  const char **psource = &source;
305  glShaderSourceARB(m_FragmentShader, 1, psource, NULL);
306  glCompileShaderARB(m_FragmentShader);
307 
308  int IsCompiled_FS;
309  int maxLength;
310  char *fragmentInfoLog;
311 
312  glGetShaderiv(m_FragmentShader, GL_COMPILE_STATUS, &IsCompiled_FS);
313  if(IsCompiled_FS == MO_FALSE)
314  {
315  glGetShaderiv(m_FragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
316 
317  /* The maxLength includes the NULL character */
318  fragmentInfoLog = new char[maxLength];
319 
320  glGetShaderInfoLog(m_FragmentShader, maxLength, &maxLength, fragmentInfoLog);
321 
322  if (MODebug2 != NULL)
323  MODebug2->Error(moText("Fragment Shader compile error:")
324  + "("+GetName()+")"
325  + moText(fragmentInfoLog) );
326 
327  /* Handle the error in an appropriate way such as displaying a message or writing to a log file. */
328  /* In this simple program, we'll just leave */
329  delete [] fragmentInfoLog;
330  //return;
331  }
332 
333  glAttachObjectARB(m_ProgramObject, m_FragmentShader);
334 
335 
336 
337 }
338 
339 void moShaderGLSL::compileGeomShader(const moText& geom_source)
340 {
341  m_GeometryShader = glCreateShaderObjectARB(GL_GEOMETRY_SHADER_ARB);
342  const char *source = (const char *)geom_source;
343  const char **psource = &source;
344  glShaderSourceARB(m_GeometryShader, 1, psource, NULL);
345  glCompileShaderARB(m_GeometryShader);
346 
347  int IsCompiled_GS;
348  int maxLength;
349  char *geometryInfoLog;
350 
351  glGetShaderiv(m_GeometryShader, GL_COMPILE_STATUS, &IsCompiled_GS);
352  if(IsCompiled_GS == MO_FALSE)
353  {
354  glGetShaderiv(m_GeometryShader, GL_INFO_LOG_LENGTH, &maxLength);
355 
356  /* The maxLength includes the NULL character */
357  geometryInfoLog = new char[maxLength];
358 
359  glGetShaderInfoLog(m_GeometryShader, maxLength, &maxLength, geometryInfoLog);
360 
361  if (MODebug2 != NULL)
362  MODebug2->Error(moText("Geometry Shader compile error:")
363  + "("+GetName()+")"
364  + moText(geometryInfoLog) );
365 
366  /* Handle the error in an appropriate way such as displaying a message or writing to a log file. */
367  /* In this simple program, we'll just leave */
368  delete [] geometryInfoLog;
369  //return;
370  }
371 
372  glAttachObjectARB(m_ProgramObject, m_GeometryShader);
373 
374 
375 
376 }
377 
378 void moShaderGLSL::compileTessShader(const moText& tess_source)
379 {/*
380  m_TesselationShader = glCreateShaderObjectARB(GL_TESSELATION_SHADER_ARB);
381  const char *source = (const char *)tess_source;
382  const char **psource = &source;
383  glShaderSourceARB(m_TesselationShader, 1, psource, NULL);
384  glCompileShaderARB(m_TesselationShader);
385 
386  int IsCompiled_TS;
387  int maxLength;
388  char *tesselationInfoLog;
389 
390  glGetShaderiv(m_TesselationShader, GL_COMPILE_STATUS, &IsCompiled_TS);
391  if(IsCompiled_TS == MO_FALSE)
392  {
393  glGetShaderiv(m_TesselationShader, GL_INFO_LOG_LENGTH, &maxLength);
394 
395  // The maxLength includes the NULL character
396  tesselationInfoLog = new char[maxLength];
397 
398  glGetShaderInfoLog(m_TesselationShader, maxLength, &maxLength, tesselationInfoLog);
399 
400  if (MODebug2 != NULL)
401  MODebug2->Error(moText("Tesselation Shader compile error:")
402  + "("+GetName()+")"
403  + moText(tesselationInfoLog) );
404 
405  // Handle the error in an appropriate way such as displaying a message or writing to a log file.
406  // In this simple program, we'll just leave
407  delete [] tesselationInfoLog;
408  //return;
409  }
410 
411  glAttachObjectARB(m_ProgramObject, m_TesselationShader);
412 */
413 }
414 
416 {
417  glLinkProgramARB(m_ProgramObject);
418  GLint progLinkSuccess;
419  glGetObjectParameterivARB(m_ProgramObject, GL_OBJECT_LINK_STATUS_ARB, &progLinkSuccess);
420  m_VertErrorCode = progLinkSuccess;
421  m_FragErrorCode = progLinkSuccess;
422  m_GeomErrorCode = progLinkSuccess;
423  m_TessErrorCode = progLinkSuccess;
424  if (!progLinkSuccess) {
425  if (MODebug2 != NULL) {
426  MODebug2->Error(moText("Shader program could not be linked: ") + this->GetName()
427  + " Type:" + IntToStr(GetType()) );
429  }
430  }
431 }
432 
433 void moShaderGLSL::printInfoLog(GLhandleARB obj)
434 {
435  GLint infologLength = 0;
436  GLsizei charsWritten = 0;
437  char *infoLog;
438 
439  glGetObjectParameterivARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &infologLength);
440 
441  if (infologLength > 0)
442  {
443  infoLog = (char *)malloc(infologLength);
444  glGetInfoLogARB(obj, infologLength, &charsWritten, infoLog);
445  moText msg = moText(infoLog);
446  if (MODebug2 != NULL) MODebug2->Log(msg);
447  free(infoLog);
448  }
449 }
virtual MOboolean Init()
Definition: moShader.cpp:214
void compileVertShader(const moText &vert_source)
GLhandleARB m_TesselationShader
Definition: moShaderGLSL.h:180
virtual void CreateGeomShader(const moText &geom_source)
virtual MOboolean Finish()
void Error(moText p_text)
Anuncia y registra un error.
Definition: moAbstract.cpp:79
GLhandleARB m_VertexShader
Definition: moShaderGLSL.h:178
void printInfoLog(GLhandleARB obj)
virtual void LoadGeomShader(const moText &geom_filename)
GLhandleARB m_ProgramObject
Definition: moShaderGLSL.h:176
virtual void CreateTessShader(const moText &tess_source)
#define MOboolean
Definition: moTypes.h:385
MOint m_VertErrorCode
Definition: moShader.h:330
MOuint GetType()
Definition: moShader.h:283
virtual MOboolean Finish()
Definition: moShader.cpp:219
virtual moText LoadShaderSource(const moText &p_fn)
Definition: moShader.cpp:263
void PrintTessShaderLog()
void PrintVertShaderLog()
virtual ~moShaderGLSL()
GLint GetUniformID(const moText &uName)
virtual void CreateFragShader(const moText &frag_source)
virtual void StopShader()
MOint m_FragErrorCode
Definition: moShader.h:331
virtual void StartShader()
Definition: moShader.cpp:228
MOint m_TessErrorCode
Definition: moShader.h:333
MOint m_GeomErrorCode
Definition: moShader.h:332
clase de para manejar textos
Definition: moText.h:75
void compileTessShader(const moText &tess_source)
virtual void LoadVertShader(const moText &vert_filename)
void Log(moText p_text)
Escribe un mensaje en el archivo de registro (log)
Definition: moAbstract.cpp:123
moText0 moText
Definition: moText.h:291
GLhandleARB m_FragmentShader
Definition: moShaderGLSL.h:177
void compileFragShader(const moText &frag_source)
virtual void StopShader()
Definition: moShader.cpp:233
void linkProgram()
virtual void LoadShader(const moText &vert_filename, const moText &frag_filename)
virtual void LoadFragShader(const moText &frag_filename)
void SetType(MOuint p_type)
Definition: moShader.h:288
virtual void CreateShader(const moText &vert_source, const moText &frag_source)
static moDebug * MODebug2
Clase de impresión de errores para depuración.
Definition: moAbstract.h:225
virtual MOboolean Init()
void PrintGeomShaderLog()
virtual void LoadTessShader(const moText &tess_filename)
#define MO_FALSE
Definition: moTypes.h:369
LIBMOLDEO_API moText0 IntToStr(int a)
Definition: moText.cpp:1070
moText GetName()
Definition: moShader.h:293
void PrintFragShaderLog()
virtual void StartShader()
void Message(moText p_text)
Anuncia un mensaje al usuario además de guardarlo en el log de texto.
Definition: moAbstract.cpp:114
virtual void CreateVertShader(const moText &vert_source)
GLint GetAttribID(const moText &aName)
GLhandleARB m_GeometryShader
Definition: moShaderGLSL.h:179
void compileGeomShader(const moText &geom_source)