From 569a8d0f4288d71218e44e429d1915f11613c5ba Mon Sep 17 00:00:00 2001 From: PedroEdiaz Date: Thu, 14 Nov 2024 20:11:30 -0600 Subject: [PATCH] Fix: specular Muy bien!!, nada mas habian 2 errores por mi parte, 'Normal' no estaba normalizado, lo que afectaba las potencias con 'pow'. Ademas habia un error con los buffers del shader lo que afectaba toda la iluminacion. Sin embargo lo hiciste muy bien, solo que te falto definir viewPos. --- src/context.c | 2 -- src/data/shaders.h | 24 ++++++++++++------------ src/mesh.c | 4 ++-- src/surface.c | 19 ++----------------- 4 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/context.c b/src/context.c index 32b1f18..df0dc5c 100644 --- a/src/context.c +++ b/src/context.c @@ -4,8 +4,6 @@ void set_clean_color_context( unsigned char r, unsigned char g, unsigned char b ) { glEnable( GL_DEPTH_TEST ); - glEnable( GL_CULL_FACE ); - glCullFace( GL_BACK ); glClearColor( (float)r/0xff, (float)g/0xff, (float)b/0xff, 1.0 ); } diff --git a/src/data/shaders.h b/src/data/shaders.h index 5ae40ac..07eac94 100644 --- a/src/data/shaders.h +++ b/src/data/shaders.h @@ -25,7 +25,7 @@ const char * vs = " index=idx;" " vec3 aNormal = vec3(aNormal_x,aNormal_y,aNormal_z);" " vec3 aPos = vec3(aPos_x,aPos_y,aPos_z);" - " Normal = mat3(transpose(inverse(rot*mdl))) * aNormal;" + " Normal = normalize(mat3(transpose(inverse(rot*mdl))) * aNormal);" " gl_Position = fix * rot * mdl * vec4( aPos, 1.0 );\n" " FragPos = vec3( rot * mdl * vec4(aPos, 1.0));" "}"; @@ -52,26 +52,26 @@ const char * fs = "uniform sampler2DArray palette;" "in float index;" - "out vec4 FragColor;" "in vec3 Normal;" "in vec3 FragPos;" - "uniform vec3 viewPos;\n" - "const float specularStrength = 0.5;\n" + + "out vec4 FragColor;" "void main()" "{" " vec4 color = texture(palette, vec3(0, 0, index));\n" - " vec3 lightPos = vec3(0, 0, -15);\n" - " vec3 lightDir = normalize(lightPos - FragPos);\n" - - " float diffuse = max(dot(Normal, lightDir), 0.0);\n" + " vec3 viewPos = vec3(0, 0, -15);\n" " vec3 viewDir = normalize(viewPos - FragPos);\n" + + " vec3 lightPos = viewPos\n;" + " vec3 lightDir = normalize(lightPos - FragPos);\n" " vec3 reflectDir = reflect(-lightDir, Normal);\n" - " float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);\n" - " vec3 specular = specularStrength * spec * vec3(1.0); \n" - " vec3 result = (0.5 + 0.5 * diffuse) * color.rgb + specular;\n" + " float specular = pow(max(dot(viewDir, reflectDir),0.0), 16);\n" + " float diffuse = max(dot(Normal, lightDir),0.0);\n" + + " vec3 result = (0.5 + 0.5 * diffuse + specular) * color.rgb;\n" " FragColor = vec4(result, color.a);\n" - "}"; \ No newline at end of file + "}"; diff --git a/src/mesh.c b/src/mesh.c index 21861c1..1b0758b 100755 --- a/src/mesh.c +++ b/src/mesh.c @@ -32,8 +32,8 @@ mesh_t create_mesh( float * d, float * n, unsigned char * coordanate, unsigned c glEnableVertexAttribArray(3); glGenBuffers( 1, &p->n_vbo ); - glBindBuffer( GL_ARRAY_BUFFER, p->n_vbo ); - glBufferData( GL_ARRAY_BUFFER, p->vertex*m*sizeof(float), n+1, + glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, p->n_vbo ); + glBufferData( GL_ELEMENT_ARRAY_BUFFER, p->vertex*m*sizeof(float), n+1, GL_STATIC_DRAW ); glVertexAttribPointer( 4,1,GL_FLOAT, 0, m*sizeof(float), (float*)(coordanate[0]*sizeof(float)) ); glEnableVertexAttribArray(4); diff --git a/src/surface.c b/src/surface.c index 40f67df..737a2ac 100644 --- a/src/surface.c +++ b/src/surface.c @@ -43,8 +43,9 @@ void klein(float *d_surface, int i, int j, int grid_size) float * generate_surface(int grid_size) { unsigned char m = 4; - long size = grid_size*grid_size*2*9*m; function_t f = klein; + + long size = grid_size*grid_size*6*m; float * d_surface; int k=0; @@ -55,14 +56,6 @@ float * generate_surface(int grid_size) { for (int j = 0; j < grid_size; j++) { - // triangle 1, front - f(&d_surface[k + 1], i, j, grid_size); - k+=m; - f(&d_surface[k + 1], i + 1, j, grid_size); - k+=m; - f(&d_surface[k + 1], i + 1, j + 1, grid_size); - k+=m; - // triangle 1, back f(&d_surface[k + 1], i + 1, j + 1, grid_size); k+=m; @@ -78,14 +71,6 @@ float * generate_surface(int grid_size) k+=m; f(&d_surface[k + 1], i + 1, j + 1, grid_size); k+=m; - - // triangle 2, back - f(&d_surface[k + 1], i + 1, j + 1, grid_size); - k+=m; - f(&d_surface[k + 1], i, j + 1, grid_size); - k+=m; - f(&d_surface[k + 1], i, j, grid_size); - k+=m; } }