101 lines
2.6 KiB
C++
Executable File
101 lines
2.6 KiB
C++
Executable File
#include "../../HEADERS/UTILS/ShaderMaker.h"
|
|
#include <iostream>
|
|
#include <fstream>
|
|
|
|
/* PORCATA AGGIUNTA IN SEGUITO */
|
|
#include <stdlib.h>
|
|
|
|
using namespace std;
|
|
|
|
char* ShaderMaker::readShaderSource(const char* shaderFile)
|
|
{
|
|
FILE* fp = fopen(shaderFile, "rb");
|
|
|
|
if (fp == NULL) { return NULL; }
|
|
|
|
fseek(fp, 0L, SEEK_END);
|
|
long size = ftell(fp);
|
|
|
|
fseek(fp, 0L, SEEK_SET);
|
|
char* buf = new char[size + 1];
|
|
fread(buf, 1, size, fp);
|
|
|
|
buf[size] = '\0';
|
|
fclose(fp);
|
|
|
|
return buf;
|
|
}
|
|
|
|
GLuint ShaderMaker::createProgram(char* vertexfilename, char *fragmentfilename)
|
|
{
|
|
GLenum ErrorCheckValue = glGetError();
|
|
|
|
// Creiamo gli eseguibili degli shader
|
|
//Leggiamo il codice del Vertex Shader
|
|
GLchar* VertexShader = readShaderSource(vertexfilename);
|
|
//Visualizzo sulla console il CODICE VERTEX SHADER
|
|
std::cout << VertexShader;
|
|
|
|
std::cout << "MACHEOH\n\n\n\n" << std::endl;
|
|
|
|
//Generiamo un identificativo per il vertex shader
|
|
GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
|
|
//Associamo all'identificativo il codice del vertex shader
|
|
glShaderSource(vertexShaderId, 1, (const char**)&VertexShader, NULL);
|
|
//Compiliamo il Vertex SHader
|
|
glCompileShader(vertexShaderId);
|
|
|
|
int success;
|
|
GLchar infoLog[512];
|
|
int logLength;
|
|
|
|
glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &success);
|
|
if ( GL_TRUE != success) {
|
|
glGetShaderInfoLog(vertexShaderId, 512, &logLength, infoLog);
|
|
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
|
|
}
|
|
|
|
//Leggiamo il codice del Fragment Shader
|
|
const GLchar* FragmentShader = readShaderSource(fragmentfilename);
|
|
//Visualizzo sulla console il CODICE FRAGMENT SHADER
|
|
std::cout << FragmentShader;
|
|
|
|
//Generiamo un identificativo per il FRAGMENT shader
|
|
GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragmentShaderId, 1, (const char**)&FragmentShader, NULL);
|
|
//Compiliamo il FRAGMENT SHader
|
|
glCompileShader(fragmentShaderId);
|
|
|
|
|
|
glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &success);
|
|
if ( GL_TRUE != success) {
|
|
glGetShaderInfoLog(fragmentShaderId, 512, &logLength, infoLog);
|
|
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
|
|
}
|
|
|
|
|
|
|
|
ErrorCheckValue = glGetError();
|
|
cout << ErrorCheckValue;
|
|
|
|
if (ErrorCheckValue != GL_NO_ERROR)
|
|
{
|
|
fprintf(
|
|
stderr,
|
|
"ERROR: Could not create the shaders: %s | %x\n",
|
|
"(FIX MY SOURCE)",
|
|
ErrorCheckValue
|
|
);
|
|
|
|
exit(-1);
|
|
}
|
|
//Creiamo un identificativo di un eseguibile e gli colleghiamo i due shader compilati
|
|
GLuint programId = glCreateProgram();
|
|
|
|
glAttachShader(programId, vertexShaderId);
|
|
glAttachShader(programId, fragmentShaderId);
|
|
glLinkProgram(programId);
|
|
|
|
return programId;
|
|
}
|