Apartado 2 practica 3: Comprobación de errores

parent 420348d3
Showing with 83 additions and 7 deletions
......@@ -6,6 +6,69 @@
#include "ventana_color.h"
/// Helper que compila un shader imprimiendo mensajes de error en el log
/// @return true si la compilación ha sido correcta, false en otro caso
static bool compilarShader(
GLuint shaderHandler,
std::string nombre_shader,
std::string &codigo_shader
) {
const GLchar *fuente = codigo_shader.c_str();
glShaderSource(shaderHandler, 1, &fuente, nullptr);
glCompileShader(shaderHandler);
GLint compileResult;
glGetShaderiv(shaderHandler, GL_COMPILE_STATUS, &compileResult);
if (compileResult == GL_FALSE) {
PAG::log << "No se pudo compilar shader \"" << nombre_shader << "\"" << std::endl;
GLint logLen = 0;
glGetShaderiv(shaderHandler, GL_INFO_LOG_LENGTH, &logLen);
if (logLen > 0) {
char *cLogString = new char[logLen];
glGetShaderInfoLog(shaderHandler, logLen, nullptr, cLogString);
std::string logString(cLogString);
delete[] cLogString;
PAG::log << logString << std::endl;
} else {
PAG::log << "Log de compilación vacio" << std::endl;
}
return false;
}
return true;
}
/// Helper que enlaza un programa imprimiendo mensajes de error en el log
/// @return true si el enlaze ha sido correcto, false en otro caso
static bool enlazarPrograma(
GLuint programHandler
) {
glLinkProgram(programHandler);
GLint linkSuccess = 0;
glGetProgramiv(programHandler, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE) {
PAG::log << "No se pudo enlazar programa shader" << std::endl;
GLint logLen = 0;
glGetProgramiv(programHandler, GL_INFO_LOG_LENGTH, &logLen);
if (logLen > 0) {
char *cLogString = new char[logLen];
glGetProgramInfoLog(programHandler, logLen, nullptr, cLogString);
std::string logString(cLogString);
delete[] cLogString;
PAG::log << logString << std::endl;
} else {
PAG::log << "Log de compilación vacio" << std::endl;
}
return false;
}
return true;
}
namespace PAG {
// Basado en https://stackoverflow.com/a/1008289
Renderer &Renderer::getInstance() {
......@@ -78,19 +141,32 @@ namespace PAG {
"}\n";
idVS = glCreateShader(GL_VERTEX_SHADER);
const GLchar *fuenteVS = miVertexShader.c_str();
glShaderSource(idVS, 1, &fuenteVS, nullptr);
glCompileShader(idVS);
if (idVS == 0) {
PAG::log << "No se pudo crear vertex shader." << std::endl;
return;
}
if (!compilarShader(idVS, "vertex-shader", miVertexShader)) {
return;
}
idFS = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar *fuenteFS = miFragmentShader.c_str();
glShaderSource(idFS, 1, &fuenteFS, nullptr);
glCompileShader(idFS);
if (idFS == 0) {
PAG::log << "No se pudo crear fragment shader" << std::endl;
return;
}
if (!compilarShader(idFS, "fragment-shader", miFragmentShader)) {
return;
}
idSP = glCreateProgram();
if (idSP == 0) {
PAG::log << "No se pudo crear programa shader" << std::endl;
return;
}
glAttachShader(idSP, idVS);
glAttachShader(idSP, idFS);
glLinkProgram(idSP);
enlazarPrograma(idSP);
}
void Renderer::creaModelo() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment