Skip to content

Commit 8cf61ed

Browse files
committed
Attemp to displacement maps with geometry shader
1 parent a1080fe commit 8cf61ed

File tree

6 files changed

+204
-42
lines changed

6 files changed

+204
-42
lines changed

P4GLSL/P4GLSL.vcxproj

+2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@
3535
<None Include="..\shaders_P4\geo.frag" />
3636
<None Include="..\shaders_P4\geo.vert" />
3737
<None Include="..\shaders_P4\geoquads.geo" />
38+
<None Include="..\shaders_P4\tessmodel.geo" />
3839
<None Include="..\shaders_P4\tessmodel.tcs" />
3940
<None Include="..\shaders_P4\tessmodel.tes" />
41+
<None Include="..\shaders_P4\tessmodelDummy.tes" />
4042
<None Include="..\shaders_P4\tessquads.tcs" />
4143
<None Include="..\shaders_P4\geotris.geo" />
4244
<None Include="..\shaders_P4\tessquads.tes" />

P4GLSL/P4GLSL.vcxproj.filters

+6
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,11 @@
106106
<None Include="..\shaders_P4\drawVertex.geo">
107107
<Filter>shaders</Filter>
108108
</None>
109+
<None Include="..\shaders_P4\tessmodel.geo">
110+
<Filter>shaders</Filter>
111+
</None>
112+
<None Include="..\shaders_P4\tessmodelDummy.tes">
113+
<Filter>shaders</Filter>
114+
</None>
109115
</ItemGroup>
110116
</Project>

P4GLSL/scr/main.cpp

+132-42
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ int inColor;
8686
int inNormal;
8787
int inTexCoord;
8888

89+
unsigned int programGeo;
90+
int uModelViewMatGeo, uModelViewProjMatGeo, uNormalMatGeo;
91+
int uColorTexGeo, uSpecTexGeo;
92+
int inPosGeo, inColorGeo, inNormalGeo, inTexCoordGeo;
93+
94+
95+
8996
//////////////////////////////
9097
//Shader de post-proceso
9198
unsigned int postProccesVShader;
@@ -138,6 +145,7 @@ void renderTesselationOverlay();
138145
void initContext(int argc, char** argv);
139146
void initOGL();
140147
void initShaderFw(const char *vname, const char *fname);
148+
void initShaderFwGeo(const char *vname, const char *fname);
141149
void initShaderPP(const char *vname, const char *fname);
142150
void initShaderLight(const char *vname, const char *fname);
143151
void initShaderPoints();
@@ -183,9 +191,14 @@ enum geometryShaderMode {
183191
DRAW_NORMALS,
184192
DRAW_WIREFRAME,
185193
DRAW_POINTS,
186-
DRAW_SHADED
194+
DRAW_SHADED
187195
};
188196

197+
enum displacementModes
198+
{
199+
Teselation,
200+
Geometry
201+
};
189202
enum tesselationOverlayMode {
190203
OVERLAY_NONE,
191204
OVERLAY_TRIANGLE,
@@ -197,6 +210,7 @@ enum tesselationOverlayMode {
197210
deferredPreviewMode previewMode = NOPREVIEW;
198211
geometryShaderMode geometryMode = DRAW_SHADED;
199212
tesselationOverlayMode tesselationOverlay = OVERLAY_NONE;
213+
displacementModes displacementMode = Teselation;
200214

201215
//////////////////////////////////////////////////////////////
202216
// Nuevas funciones auxiliares
@@ -211,6 +225,7 @@ int main(int argc, char** argv)
211225
initContext(argc, argv);
212226
initOGL();
213227
initShaderFw("../shaders_P4/fwRendering.v2.vert", "../shaders_P4/fwRendering.v2.frag");
228+
initShaderFwGeo("../shaders_P4/fwRendering.v2.vert", "../shaders_P4/fwRendering.v2.frag");
214229
initShaderPP("../shaders_P4/postProcessing.v2.vert",
215230
"../shaders_P4/postProcessing.v2.frag");
216231
initShaderLight("../shaders_P4/postProcessing.v2.vert", "../shaders_P4/postProcessing.light.frag");
@@ -384,6 +399,60 @@ void initShaderFw(const char *vname, const char *fname)
384399
inTexCoord = glGetAttribLocation(program, "inTexCoord");
385400
}
386401

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+
387456
void initShaderPP(const char *vname, const char *fname)
388457
{
389458

@@ -984,22 +1053,41 @@ void renderFunc()
9841053
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
9851054

9861055
/**/
987-
glUseProgram(program);
988-
989-
//Texturas
990-
if (uColorTex != -1)
1056+
switch (displacementMode)
9911057
{
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+
}
10021089
}
1090+
10031091

10041092
model = glm::mat4(2.0f);
10051093
model[3].w = 1.0f;
@@ -1096,44 +1184,44 @@ void renderFunc()
10961184

10971185
void renderCube()
10981186
{
1099-
glUseProgram(program);
1100-
11011187
glm::mat4 modelView = view * model;
11021188
glm::mat4 modelViewProj = proj * view * model;
11031189
glm::mat4 normal = glm::transpose(glm::inverse(modelView));
11041190

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+
}
11251217

1218+
11261219
glPatchParameteri(GL_PATCH_VERTICES, 3);
11271220
glBindVertexArray(vao);
11281221
/*glDrawElements(GL_TRIANGLES, numTris * 3,
11291222
GL_UNSIGNED_INT, (void*)0);*/
11301223
glDrawElements(GL_PATCHES, numTris * 3,
11311224
GL_UNSIGNED_INT, (void*)0);
1132-
1133-
while ((err = glGetError()) != GL_NO_ERROR)
1134-
{
1135-
std::cout << "Error C " << err << std::endl;
1136-
}
11371225
}
11381226

11391227

@@ -1385,6 +1473,8 @@ void specialFunc(int key, int x, int y) {
13851473
if (tesselationOverlay > OVERLAY_TESS_QUAD) tesselationOverlay = (tesselationOverlayMode) 0;
13861474
break;
13871475
case GLUT_KEY_F8:
1476+
displacementMode = (displacementModes)((int)displacementMode + 1);
1477+
if (displacementMode > Geometry) displacementMode = (displacementModes)0;
13881478
//TODO: Enable/disable displacement
13891479
break;
13901480
case GLUT_KEY_F9:

shaders_P4/tessmodel.geo

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#version 330 core
2+
3+
layout(points) in;
4+
layout(points, max_vertices = 1) out;
5+
6+
in vec3 normGeo[];
7+
in vec2 texCoordGeo[];
8+
in vec3 posGeo[];
9+
10+
out vec3 norm;
11+
out vec2 texCoord;
12+
out vec3 pos;
13+
14+
uniform sampler2D specTex;
15+
void main()
16+
{
17+
gl_Position = gl_in[0].gl_Position + vec4(texture(specTex, texCoordGeo[0]).g * normGeo[0], 0.0);
18+
19+
norm = normGeo[0];
20+
texCoord = texCoordGeo[0];
21+
22+
EmitVertex();
23+
EndPrimitive();
24+
}

shaders_P4/tessmodelDummy.tes

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#version 430 core
2+
3+
layout (triangles, equal_spacing, cw) in;
4+
5+
in vec3 tess_norm[];
6+
in vec2 tess_texCoord[];
7+
in vec3 tess_pos[];
8+
9+
out vec3 normGeo;
10+
out vec2 texCoordGeo;
11+
out vec3 posGeo;
12+
13+
void main(void){
14+
15+
gl_Position=(gl_TessCoord.x*gl_in[0].gl_Position+gl_TessCoord.y*gl_in[1].gl_Position+gl_TessCoord.z*gl_in[2].gl_Position);
16+
texCoordGeo=(gl_TessCoord.x*tess_texCoord[0]+gl_TessCoord.y*tess_texCoord[1]+gl_TessCoord.z*tess_texCoord[2]);
17+
normGeo=(gl_TessCoord.x*tess_norm[0]+gl_TessCoord.y*tess_norm[1]+gl_TessCoord.z*tess_norm[2]);
18+
}

shaders_P4/tessmodelGeo.tes

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#version 430 core
2+
3+
layout (triangles, equal_spacing, cw) in;
4+
5+
in vec3 tess_norm[];
6+
in vec2 tess_texCoord[];
7+
in vec3 tess_pos[];
8+
9+
out vec3 normGeo;
10+
out vec2 texCoordGeo;
11+
out vec3 posGeo;
12+
13+
uniform sampler2D specTex;
14+
15+
void main(void){
16+
17+
gl_Position=(gl_TessCoord.x*gl_in[0].gl_Position+gl_TessCoord.y*gl_in[1].gl_Position+gl_TessCoord.z*gl_in[2].gl_Position);
18+
texCoordGeo=(gl_TessCoord.x*tess_texCoord[0]+gl_TessCoord.y*tess_texCoord[1]+gl_TessCoord.z*tess_texCoord[2]);
19+
normGeo=(gl_TessCoord.x*tess_norm[0]+gl_TessCoord.y*tess_norm[1]+gl_TessCoord.z*tess_norm[2]);
20+
21+
gl_Position = gl_Position + vec4(texture(specTex, texCoord).g * norm, 0.0);
22+
}

0 commit comments

Comments
 (0)