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

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