@@ -86,6 +86,13 @@ int inColor;
86
86
int inNormal;
87
87
int inTexCoord;
88
88
89
+ unsigned int programGeo;
90
+ int uModelViewMatGeo, uModelViewProjMatGeo, uNormalMatGeo;
91
+ int uColorTexGeo, uSpecTexGeo;
92
+ int inPosGeo, inColorGeo, inNormalGeo, inTexCoordGeo;
93
+
94
+
95
+
89
96
// ////////////////////////////
90
97
// Shader de post-proceso
91
98
unsigned int postProccesVShader;
@@ -138,6 +145,7 @@ void renderTesselationOverlay();
138
145
void initContext (int argc, char ** argv);
139
146
void initOGL ();
140
147
void initShaderFw (const char *vname, const char *fname);
148
+ void initShaderFwGeo (const char *vname, const char *fname);
141
149
void initShaderPP (const char *vname, const char *fname);
142
150
void initShaderLight (const char *vname, const char *fname);
143
151
void initShaderPoints ();
@@ -183,9 +191,14 @@ enum geometryShaderMode {
183
191
DRAW_NORMALS,
184
192
DRAW_WIREFRAME,
185
193
DRAW_POINTS,
186
- DRAW_SHADED
194
+ DRAW_SHADED
187
195
};
188
196
197
+ enum displacementModes
198
+ {
199
+ Teselation,
200
+ Geometry
201
+ };
189
202
enum tesselationOverlayMode {
190
203
OVERLAY_NONE,
191
204
OVERLAY_TRIANGLE,
@@ -197,6 +210,7 @@ enum tesselationOverlayMode {
197
210
deferredPreviewMode previewMode = NOPREVIEW;
198
211
geometryShaderMode geometryMode = DRAW_SHADED;
199
212
tesselationOverlayMode tesselationOverlay = OVERLAY_NONE;
213
+ displacementModes displacementMode = Teselation;
200
214
201
215
// ////////////////////////////////////////////////////////////
202
216
// Nuevas funciones auxiliares
@@ -211,6 +225,7 @@ int main(int argc, char** argv)
211
225
initContext (argc, argv);
212
226
initOGL ();
213
227
initShaderFw (" ../shaders_P4/fwRendering.v2.vert" , " ../shaders_P4/fwRendering.v2.frag" );
228
+ initShaderFwGeo (" ../shaders_P4/fwRendering.v2.vert" , " ../shaders_P4/fwRendering.v2.frag" );
214
229
initShaderPP (" ../shaders_P4/postProcessing.v2.vert" ,
215
230
" ../shaders_P4/postProcessing.v2.frag" );
216
231
initShaderLight (" ../shaders_P4/postProcessing.v2.vert" , " ../shaders_P4/postProcessing.light.frag" );
@@ -384,6 +399,60 @@ void initShaderFw(const char *vname, const char *fname)
384
399
inTexCoord = glGetAttribLocation (program, " inTexCoord" );
385
400
}
386
401
402
+ void initShaderFwGeo (const char *vname, const char *fname)
403
+ {
404
+ vshader = loadShader (vname, GL_VERTEX_SHADER);
405
+ fshader = loadShader (fname, GL_FRAGMENT_SHADER);
406
+ auto tcsShader = loadShader (" ../shaders_P4/tessmodel.tcs" , GL_TESS_CONTROL_SHADER);
407
+ auto tesShader = loadShader (" ../shaders_P4/tessmodelDummy.tes" , GL_TESS_EVALUATION_SHADER);
408
+ auto geoShader = loadShader (" ../shaders_P4/tessmodel.geo" , GL_GEOMETRY_SHADER);
409
+
410
+ programGeo = glCreateProgram ();
411
+ glAttachShader (programGeo, vshader);
412
+ glAttachShader (programGeo, fshader);
413
+ glAttachShader (programGeo, tcsShader);
414
+ glAttachShader (programGeo, tesShader);
415
+ glAttachShader (programGeo, geoShader);
416
+
417
+ glBindAttribLocation (programGeo, 0 , " inPos" );
418
+ glBindAttribLocation (programGeo, 1 , " inColor" );
419
+ glBindAttribLocation (programGeo, 2 , " inNormal" );
420
+ glBindAttribLocation (programGeo, 3 , " inTexCoord" );
421
+
422
+
423
+ glLinkProgram (programGeo);
424
+
425
+ int linked;
426
+ glGetProgramiv (programGeo, GL_LINK_STATUS, &linked);
427
+ if (!linked)
428
+ {
429
+ // Calculamos una cadena de error
430
+ GLint logLen;
431
+ glGetProgramiv (programGeo, GL_INFO_LOG_LENGTH, &logLen);
432
+
433
+ char *logString = new char [logLen];
434
+ glGetProgramInfoLog (programGeo, logLen, NULL , logString);
435
+ std::cout << " Error: " << logString << std::endl;
436
+ delete logString;
437
+
438
+ glDeleteProgram (programGeo);
439
+ programGeo = 0 ;
440
+ exit (-1 );
441
+ }
442
+
443
+ uNormalMatGeo = glGetUniformLocation (programGeo, " normal" );
444
+ uModelViewMatGeo = glGetUniformLocation (programGeo, " modelView" );
445
+ uModelViewProjMatGeo = glGetUniformLocation (programGeo, " modelViewProj" );
446
+
447
+ uColorTexGeo = glGetUniformLocation (programGeo, " colorTex" );
448
+ uSpecTexGeo = glGetUniformLocation (programGeo, " specTex" );
449
+
450
+ inPosGeo = glGetAttribLocation (programGeo, " inPos" );
451
+ inColorGeo = glGetAttribLocation (programGeo, " inColor" );
452
+ inNormalGeo = glGetAttribLocation (programGeo, " inNormal" );
453
+ inTexCoordGeo = glGetAttribLocation (programGeo, " inTexCoord" );
454
+ }
455
+
387
456
void initShaderPP (const char *vname, const char *fname)
388
457
{
389
458
@@ -984,22 +1053,41 @@ void renderFunc()
984
1053
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
985
1054
986
1055
/* */
987
- glUseProgram (program);
988
-
989
- // Texturas
990
- if (uColorTex != -1 )
1056
+ switch (displacementMode)
991
1057
{
992
- glActiveTexture (GL_TEXTURE0);
993
- glBindTexture (GL_TEXTURE_2D, colorTexId);
994
- glUniform1i (uColorTex, 0 );
995
- }
996
-
997
- if (uSpecTex != -1 )
998
- {
999
- glActiveTexture (GL_TEXTURE0 + 1 );
1000
- glBindTexture (GL_TEXTURE_2D, specTexId);
1001
- glUniform1i (uSpecTex, 1 );
1058
+ case Teselation:
1059
+ glUseProgram (program);
1060
+ if (uColorTex != -1 )
1061
+ {
1062
+ glActiveTexture (GL_TEXTURE0);
1063
+ glBindTexture (GL_TEXTURE_2D, colorTexId);
1064
+ glUniform1i (uColorTex, 0 );
1065
+ }
1066
+
1067
+ if (uSpecTex != -1 )
1068
+ {
1069
+ glActiveTexture (GL_TEXTURE0 + 1 );
1070
+ glBindTexture (GL_TEXTURE_2D, specTexId);
1071
+ glUniform1i (uSpecTex, 1 );
1072
+ }
1073
+ break ;
1074
+ case Geometry:
1075
+ glUseProgram (programGeo);
1076
+ if (uColorTexGeo != -1 )
1077
+ {
1078
+ glActiveTexture (GL_TEXTURE0);
1079
+ glBindTexture (GL_TEXTURE_2D, colorTexId);
1080
+ glUniform1i (uColorTexGeo, 0 );
1081
+ }
1082
+
1083
+ if (uSpecTexGeo != -1 )
1084
+ {
1085
+ glActiveTexture (GL_TEXTURE0 + 1 );
1086
+ glBindTexture (GL_TEXTURE_2D, specTexId);
1087
+ glUniform1i (uSpecTexGeo, 1 );
1088
+ }
1002
1089
}
1090
+
1003
1091
1004
1092
model = glm::mat4 (2 .0f );
1005
1093
model[3 ].w = 1 .0f ;
@@ -1096,44 +1184,44 @@ void renderFunc()
1096
1184
1097
1185
void renderCube ()
1098
1186
{
1099
- glUseProgram (program);
1100
-
1101
1187
glm::mat4 modelView = view * model;
1102
1188
glm::mat4 modelViewProj = proj * view * model;
1103
1189
glm::mat4 normal = glm::transpose (glm::inverse (modelView));
1104
1190
1105
- GLenum err;
1106
- while ((err = glGetError ()) != GL_NO_ERROR)
1107
- {
1108
- std::cout << " Error A " << err << std::endl;
1109
- }
1110
-
1111
- if (uModelViewMat != -1 )
1112
- glUniformMatrix4fv (uModelViewMat, 1 , GL_FALSE,
1113
- &(modelView[0 ][0 ]));
1114
- if (uModelViewProjMat != -1 )
1115
- glUniformMatrix4fv (uModelViewProjMat, 1 , GL_FALSE,
1116
- &(modelViewProj[0 ][0 ]));
1117
- if (uNormalMat != -1 )
1118
- glUniformMatrix4fv (uNormalMat, 1 , GL_FALSE,
1119
- &(normal [0 ][0 ]));
1120
-
1121
- while ((err = glGetError ()) != GL_NO_ERROR)
1122
- {
1123
- std::cout << " Error B " << err << std::endl;
1124
- }
1191
+ switch (displacementMode)
1192
+ {
1193
+ case Teselation:
1194
+ glUseProgram (program);
1195
+ if (uModelViewMat != -1 )
1196
+ glUniformMatrix4fv (uModelViewMat, 1 , GL_FALSE,
1197
+ &(modelView[0 ][0 ]));
1198
+ if (uModelViewProjMat != -1 )
1199
+ glUniformMatrix4fv (uModelViewProjMat, 1 , GL_FALSE,
1200
+ &(modelViewProj[0 ][0 ]));
1201
+ if (uNormalMat != -1 )
1202
+ glUniformMatrix4fv (uNormalMat, 1 , GL_FALSE,
1203
+ &(normal [0 ][0 ]));
1204
+ break ;
1205
+ case Geometry:
1206
+ glUseProgram (programGeo);
1207
+ if (uModelViewMatGeo != -1 )
1208
+ glUniformMatrix4fv (uModelViewMatGeo, 1 , GL_FALSE,
1209
+ &(modelView[0 ][0 ]));
1210
+ if (uModelViewProjMatGeo != -1 )
1211
+ glUniformMatrix4fv (uModelViewProjMatGeo, 1 , GL_FALSE,
1212
+ &(modelViewProj[0 ][0 ]));
1213
+ if (uNormalMatGeo != -1 )
1214
+ glUniformMatrix4fv (uNormalMatGeo, 1 , GL_FALSE,
1215
+ &(normal [0 ][0 ]));
1216
+ }
1125
1217
1218
+
1126
1219
glPatchParameteri (GL_PATCH_VERTICES, 3 );
1127
1220
glBindVertexArray (vao);
1128
1221
/* glDrawElements(GL_TRIANGLES, numTris * 3,
1129
1222
GL_UNSIGNED_INT, (void*)0);*/
1130
1223
glDrawElements (GL_PATCHES, numTris * 3 ,
1131
1224
GL_UNSIGNED_INT, (void *)0 );
1132
-
1133
- while ((err = glGetError ()) != GL_NO_ERROR)
1134
- {
1135
- std::cout << " Error C " << err << std::endl;
1136
- }
1137
1225
}
1138
1226
1139
1227
@@ -1385,6 +1473,8 @@ void specialFunc(int key, int x, int y) {
1385
1473
if (tesselationOverlay > OVERLAY_TESS_QUAD) tesselationOverlay = (tesselationOverlayMode) 0 ;
1386
1474
break ;
1387
1475
case GLUT_KEY_F8:
1476
+ displacementMode = (displacementModes)((int )displacementMode + 1 );
1477
+ if (displacementMode > Geometry) displacementMode = (displacementModes)0 ;
1388
1478
// TODO: Enable/disable displacement
1389
1479
break ;
1390
1480
case GLUT_KEY_F9:
0 commit comments