107 lines
2.5 KiB
C++
107 lines
2.5 KiB
C++
#include "MyGraphicsEngine/Shader.h"
|
|
|
|
Shader::Shader(const std::string vertexShaderPath, const std::string fragmentShaderPath)
|
|
{
|
|
char infoLog[512];
|
|
int succes;
|
|
|
|
char* vertexCode = readFile(vertexShaderPath.c_str());
|
|
unsigned int vertId = glCreateShader(GL_VERTEX_SHADER);
|
|
|
|
spdlog::info(vertexCode);
|
|
|
|
glShaderSource(vertId, 1, &vertexCode, NULL);
|
|
glCompileShader(vertId);
|
|
|
|
glGetShaderiv(vertId, GL_COMPILE_STATUS, &succes);
|
|
if(!succes){
|
|
glGetShaderInfoLog(vertId, 512, NULL, infoLog);
|
|
spdlog::error( "Vertex shader has compile error {}", infoLog);
|
|
return;
|
|
}
|
|
|
|
|
|
char* fragmentCode = readFile(fragmentShaderPath.c_str());
|
|
|
|
unsigned int fragId = glCreateShader(GL_FRAGMENT_SHADER);
|
|
|
|
|
|
|
|
glShaderSource(fragId, 1, &fragmentCode, NULL);
|
|
glCompileShader(fragId);
|
|
|
|
|
|
glGetShaderiv(fragId, GL_COMPILE_STATUS, &succes);
|
|
if(!succes){
|
|
glGetShaderInfoLog(fragId, 512, NULL, infoLog);
|
|
spdlog::error("Fragment shader has compile error {}", infoLog);
|
|
return;
|
|
}
|
|
|
|
id = glCreateProgram();
|
|
|
|
glAttachShader(id, vertId);
|
|
glAttachShader(id, fragId);
|
|
glLinkProgram(id);
|
|
|
|
|
|
int success;
|
|
glGetProgramiv(id, GL_LINK_STATUS, &success);
|
|
if(!success) {
|
|
glGetProgramInfoLog(id, 512, NULL, infoLog);
|
|
printf("ERROR::SHADER_PROGRAM::LINKING_FAILED\n %s", infoLog);
|
|
}
|
|
|
|
|
|
delete[] vertexCode;
|
|
delete[] fragmentCode;
|
|
|
|
|
|
}
|
|
char* Shader::readFile (const char* filePath){
|
|
spdlog::info("try Open file {}", filePath);
|
|
std::ifstream file ;
|
|
file.open(filePath);
|
|
|
|
if(file.is_open() == false){
|
|
spdlog::info("File not found.");
|
|
return nullptr;
|
|
}
|
|
|
|
|
|
// Determine the file size!
|
|
file.seekg(0, std::ios::end);
|
|
size_t filesize = file.tellg();
|
|
|
|
// Undo previous seek.
|
|
file.seekg(0, std::ios::beg);
|
|
spdlog::info("filesize: {}", filesize);
|
|
|
|
|
|
// Create a big enough buffer for the file
|
|
|
|
//calculate buffer size to prevent memory issues
|
|
size_t ChunksInBuffer = filesize / Shader::CHUNK_SIZE;
|
|
size_t bufferSize = (ChunksInBuffer + 1) * Shader::CHUNK_SIZE;
|
|
|
|
|
|
char* FileBuffer = new char[bufferSize];
|
|
|
|
memset(FileBuffer, '\0', bufferSize);
|
|
size_t bytesRead= 0;
|
|
|
|
// read the whole file
|
|
while( file.eof() == false){
|
|
file.read(FileBuffer + bytesRead, CHUNK_SIZE );
|
|
bytesRead += CHUNK_SIZE;
|
|
}
|
|
|
|
FileBuffer[filesize + 1] = '\0';
|
|
|
|
return FileBuffer;
|
|
}
|
|
|
|
void Shader::Use()
|
|
{
|
|
glUseProgram(id);
|
|
} |