Last active
May 25, 2021 18:35
-
-
Save CaptainHandyman/a87ff81a0c7635170418f9b3e6c5dd9d to your computer and use it in GitHub Desktop.
OpenGL vertex and fragment shader loading script.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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