Skip to content

Instantly share code, notes, and snippets.

@CaptainHandyman
Last active May 25, 2021 18:35
Show Gist options
  • Save CaptainHandyman/a87ff81a0c7635170418f9b3e6c5dd9d to your computer and use it in GitHub Desktop.
Save CaptainHandyman/a87ff81a0c7635170418f9b3e6c5dd9d to your computer and use it in GitHub Desktop.
OpenGL vertex and fragment shader loading script.
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
void scanShaderForErrors(GLuint &shader, const GLuint &shaderType) {
int success;
char LOG[WCHAR_MAX];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, WCHAR_MAX, NULL, LOG);
if (shaderType == GL_VERTEX_SHADER)
cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"
<< LOG << endl;
else if (shaderType == GL_FRAGMENT_SHADER)
cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n"
<< LOG << endl;
}
}
GLuint loadShaders(const char *vertexShaderPath,
const char *fragmentShaderPath) {
ifstream shaderFile;
shaderFile.open(vertexShaderPath);
if (!shaderFile) {
cout << "Unable to open vertex shader file "s + string(vertexShaderPath)
+ '.'
<< endl;
exit(EXIT_FAILURE);
}
string line, vertexShaderSource, fragmentShaderSource;
while (getline(shaderFile, line)) { vertexShaderSource += line + '\n'; }
shaderFile.close();
shaderFile.clear();
shaderFile.open(fragmentShaderPath);
if (!shaderFile) {
cout << "Unable to open fragment shader file "s
+ string(vertexShaderPath) + '.'
<< endl;
exit(EXIT_FAILURE);
}
while (getline(shaderFile, line)) { fragmentShaderSource += line + '\n'; }
shaderFile.close();
shaderFile.clear();
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER),
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER),
shaderProgram = glCreateProgram();
const char *vertexShaderSourceC_STR = vertexShaderSource.c_str(),
*fragmentShaderSourceC_STR = fragmentShaderSource.c_str();
glShaderSource(vertexShader, 1, &vertexShaderSourceC_STR, NULL);
glCompileShader(vertexShader);
glShaderSource(fragmentShader, 1, &fragmentShaderSourceC_STR, NULL);
glCompileShader(fragmentShader);
scanShaderForErrors(vertexShader, GL_VERTEX_SHADER);
scanShaderForErrors(fragmentShader, GL_FRAGMENT_SHADER);
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return shaderProgram;
}
int main() { /*...*/ }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment