Apartado 3 practica 3: Movido código de los shaders a archivos aparte

parent 28fcc7e6
...@@ -118,7 +118,7 @@ int main() { ...@@ -118,7 +118,7 @@ int main() {
renderer.inicializaOpenGL(); renderer.inicializaOpenGL();
renderer.setClearColor(ventana_color->getColor()); renderer.setClearColor(ventana_color->getColor());
renderer.creaShaderProgram(); renderer.creaShaderProgram("pag03");
renderer.creaModelo(); renderer.creaModelo();
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
......
#version 410
out vec4 colorFragmento;
void main() {
colorFragmento = vec4(1.0, .4, .2, 1.0);
}
#version 410
layout (location = 0) in vec3 posicion;
void main() {
gl_Position = vec4(posicion, 1);
}
#include "renderer.h" #include "renderer.h"
#include <glad/glad.h> #include <glad/glad.h>
#include <fstream>
#include <stdexcept>
#include "log.h" #include "log.h"
...@@ -69,6 +71,23 @@ static bool enlazarPrograma( ...@@ -69,6 +71,23 @@ static bool enlazarPrograma(
return true; return true;
} }
/// Helper que devuelve el contenido de un archivo como un string
/// @throws std::runtime_error si no puede cargar el archivo
static std::string leerArchivo(std::string nombre) {
std::ifstream archivo;
archivo.open(nombre);
if (!archivo) {
throw std::runtime_error("Cannot open file");
}
std::stringstream streamContenidos;
streamContenidos << archivo.rdbuf();
archivo.close();
return streamContenidos.str();
}
namespace PAG { namespace PAG {
// Basado en https://stackoverflow.com/a/1008289 // Basado en https://stackoverflow.com/a/1008289
Renderer &Renderer::getInstance() { Renderer &Renderer::getInstance() {
...@@ -125,27 +144,32 @@ namespace PAG { ...@@ -125,27 +144,32 @@ namespace PAG {
} }
} }
void Renderer::creaShaderProgram() { void Renderer::creaShaderProgram(std::string prefijo) {
std::string miVertexShader = std::string nombreVertexShader = prefijo + "-vs.glsl";
"#version 410\n" std::string nombreFragmentShader = prefijo + "-fs.glsl";
"layout (location = 0) in vec3 posicion;\n"
"void main() {\n"
" gl_Position = vec4(posicion, 1);\n"
"}\n";
std::string miFragmentShader = std::string vertexShader;
"#version 410\n" try {
"out vec4 colorFragmento;\n" vertexShader = leerArchivo(nombreVertexShader);
"void main() {\n" } catch (std::runtime_error &e) {
" colorFragmento = vec4(1.0, .4, .2, 1.0);\n" PAG::log << "No se pudo leer el archivo \"" << nombreVertexShader << "\"" << std::endl;
"}\n"; return;
}
std::string fragmentShader;
try {
fragmentShader = leerArchivo(nombreFragmentShader);
} catch (std::runtime_error &e) {
PAG::log << "No se pudo leer el archivo \"" << nombreFragmentShader << "\"" << std::endl;
return;
}
idVS = glCreateShader(GL_VERTEX_SHADER); idVS = glCreateShader(GL_VERTEX_SHADER);
if (idVS == 0) { if (idVS == 0) {
PAG::log << "No se pudo crear vertex shader." << std::endl; PAG::log << "No se pudo crear vertex shader." << std::endl;
return; return;
} }
if (!compilarShader(idVS, "vertex-shader", miVertexShader)) { if (!compilarShader(idVS, nombreVertexShader, vertexShader)) {
return; return;
} }
...@@ -154,7 +178,7 @@ namespace PAG { ...@@ -154,7 +178,7 @@ namespace PAG {
PAG::log << "No se pudo crear fragment shader" << std::endl; PAG::log << "No se pudo crear fragment shader" << std::endl;
return; return;
} }
if (!compilarShader(idFS, "fragment-shader", miFragmentShader)) { if (!compilarShader(idFS, nombreFragmentShader, fragmentShader)) {
return; return;
} }
......
...@@ -31,7 +31,7 @@ namespace PAG { ...@@ -31,7 +31,7 @@ namespace PAG {
void wakeUp(Ventana &) override; void wakeUp(Ventana &) override;
void creaShaderProgram(); void creaShaderProgram(std::string prefijo_archivos);
void creaModelo(); void creaModelo();
private: private:
......
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