diff options
author | Andreas Grois <andi@grois.info> | 2018-03-09 21:36:10 +0100 |
---|---|---|
committer | Andreas Grois <andi@grois.info> | 2018-03-09 21:36:10 +0100 |
commit | 3b734f0d6b9e28c1f2c4ae54e3f46e573e02f4a5 (patch) | |
tree | 444542870666e41594e7b493f625ade81d64f885 /BuddhaTest/src/Helpers.cpp |
Initial Commit
Diffstat (limited to 'BuddhaTest/src/Helpers.cpp')
-rw-r--r-- | BuddhaTest/src/Helpers.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/BuddhaTest/src/Helpers.cpp b/BuddhaTest/src/Helpers.cpp new file mode 100644 index 0000000..e9caba9 --- /dev/null +++ b/BuddhaTest/src/Helpers.cpp @@ -0,0 +1,149 @@ +#include "Helpers.h"
+#include <string>
+#include <fstream>
+#include <sstream>
+#include <vector>
+
+namespace Helpers
+{
+ GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path) {
+
+ // Create the shaders
+ GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
+ GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
+
+ // Read the Vertex Shader code from the file
+ std::string VertexShaderCode;
+ std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
+ if (VertexShaderStream.is_open()) {
+ std::stringstream sstr;
+ sstr << VertexShaderStream.rdbuf();
+ VertexShaderCode = sstr.str();
+ VertexShaderStream.close();
+ }
+ else {
+ printf("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n", vertex_file_path);
+ getchar();
+ return 0;
+ }
+
+ // Read the Fragment Shader code from the file
+ std::string FragmentShaderCode;
+ std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
+ if (FragmentShaderStream.is_open()) {
+ std::stringstream sstr;
+ sstr << FragmentShaderStream.rdbuf();
+ FragmentShaderCode = sstr.str();
+ FragmentShaderStream.close();
+ }
+
+ GLint Result = GL_FALSE;
+ int InfoLogLength;
+
+ // Compile Vertex Shader
+ printf("Compiling shader : %s\n", vertex_file_path);
+ char const * VertexSourcePointer = VertexShaderCode.c_str();
+ glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
+ glCompileShader(VertexShaderID);
+
+ // Check Vertex Shader
+ glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
+ glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+ if (InfoLogLength > 0) {
+ std::vector<char> VertexShaderErrorMessage(InfoLogLength + 1);
+ glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
+ printf("%s\n", &VertexShaderErrorMessage[0]);
+ }
+
+
+ // Compile Fragment Shader
+ printf("Compiling shader : %s\n", fragment_file_path);
+ char const * FragmentSourcePointer = FragmentShaderCode.c_str();
+ glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
+ glCompileShader(FragmentShaderID);
+
+ // Check Fragment Shader
+ glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
+ glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+ if (InfoLogLength > 0) {
+ std::vector<char> FragmentShaderErrorMessage(InfoLogLength + 1);
+ glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
+ printf("%s\n", &FragmentShaderErrorMessage[0]);
+ }
+
+ // Link the program
+ printf("Linking program\n");
+ GLuint ProgramID = glCreateProgram();
+ glAttachShader(ProgramID, VertexShaderID);
+ glAttachShader(ProgramID, FragmentShaderID);
+ glLinkProgram(ProgramID);
+
+ // Check the program
+ glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
+ glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+ if (InfoLogLength > 0) {
+ std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
+ glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
+ printf("%s\n", &ProgramErrorMessage[0]);
+ }
+
+ glDetachShader(ProgramID, VertexShaderID);
+ glDetachShader(ProgramID, FragmentShaderID);
+
+ glDeleteShader(VertexShaderID);
+ glDeleteShader(FragmentShaderID);
+
+ return ProgramID;
+ }
+
+ GLuint LoadComputeShader(const char* compute_file_path)
+ {
+ GLuint ComputeShaderID = glCreateShader(GL_COMPUTE_SHADER);
+ // Read the compute shader
+ std::string ComputeShaderCode;
+ {
+ std::ifstream ComputeShaderCodeStream(compute_file_path, std::ios::in);
+ if (ComputeShaderCodeStream.is_open()) {
+ std::stringstream sstr;
+ sstr << ComputeShaderCodeStream.rdbuf();
+ ComputeShaderCode = sstr.str();
+ ComputeShaderCodeStream.close();
+ }
+ }
+
+ GLint Result = GL_FALSE;
+ int InfoLogLength;
+
+ {
+ // Compile Compute Shader
+ printf("Compiling shader : %s\n", compute_file_path);
+ char const * ComputeSourcePointer = ComputeShaderCode.c_str();
+ glShaderSource(ComputeShaderID, 1, &ComputeSourcePointer, NULL);
+ glCompileShader(ComputeShaderID);
+
+ // Check Compute Shader
+ glGetShaderiv(ComputeShaderID, GL_COMPILE_STATUS, &Result);
+ glGetShaderiv(ComputeShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+ if (InfoLogLength > 0) {
+ std::vector<char> ComputeShaderErrorMessage(InfoLogLength + 1);
+ glGetShaderInfoLog(ComputeShaderID, InfoLogLength, NULL, &ComputeShaderErrorMessage[0]);
+ printf("%s\n", &ComputeShaderErrorMessage[0]);
+ }
+ }
+ GLuint ProgramID = glCreateProgram();
+ glAttachShader(ProgramID, ComputeShaderID);
+ glLinkProgram(ProgramID);
+
+ // Check the program
+ glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
+ glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+ if (InfoLogLength > 0) {
+ std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
+ glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
+ printf("%s\n", &ProgramErrorMessage[0]);
+ }
+ glDetachShader(ProgramID, ComputeShaderID);
+ glDeleteShader(ComputeShaderID);
+ return ProgramID;
+ }
+}
|