Add small example
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
#include <opengl-playground/openglshader.hpp>
|
||||
#include <string.h>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
OpenGlShaderProgram::OpenGlShaderProgram(std::string vertex_file, std::string geometry_file, std::string fragment_file)
|
||||
{
|
||||
@@ -10,12 +13,16 @@ OpenGlShaderProgram::OpenGlShaderProgram(std::string vertex_file, std::string ge
|
||||
|
||||
OpenGlShaderProgram::~OpenGlShaderProgram()
|
||||
{
|
||||
this->unload();
|
||||
|
||||
}
|
||||
|
||||
char *load_shader_program_from_file(std::string file_name)
|
||||
std::string load_shader_program_from_file(std::string &file_name)
|
||||
{
|
||||
return NULL;
|
||||
std::ifstream ifs(file_name);
|
||||
std::string file_content((std::istreambuf_iterator<char>(ifs)),
|
||||
(std::istreambuf_iterator<char>()));
|
||||
|
||||
return file_content;
|
||||
}
|
||||
|
||||
int OpenGlShaderProgram::compile()
|
||||
@@ -25,7 +32,8 @@ int OpenGlShaderProgram::compile()
|
||||
char info_log[512];
|
||||
unsigned int vertex_shader, geometry_shader, fragment_shader;
|
||||
bool vertex_b = false, geo_b = false, frag_b = false;
|
||||
char *src_code;
|
||||
std::string src_code;
|
||||
const char *c_string;
|
||||
|
||||
if (this->compiled) {
|
||||
glDeleteProgram(shader_program);
|
||||
@@ -37,32 +45,37 @@ int OpenGlShaderProgram::compile()
|
||||
if (!vertex_file.empty()) {
|
||||
vertex_b = true;
|
||||
|
||||
src_code = load_shader_program_from_file(this->vertex_file);
|
||||
c_string = src_code.c_str();
|
||||
|
||||
/* Compile the vertex shader */
|
||||
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(vertex_shader, 1, &src_code, NULL);
|
||||
|
||||
glShaderSource(vertex_shader, 1, &c_string, NULL);
|
||||
glCompileShader(vertex_shader);
|
||||
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
|
||||
free(src_code);
|
||||
|
||||
if (!success) {
|
||||
glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
|
||||
fprintf(stderr, "%s\n", info_log);
|
||||
printf("Error in vertex shader: %s\n", info_log);
|
||||
ret_code = -1;
|
||||
goto delete_vertex;
|
||||
}
|
||||
|
||||
glAttachShader(this->shader_program, vertex_shader);
|
||||
}
|
||||
} else
|
||||
printf("Empty\n");
|
||||
|
||||
if (!this->geometry_file.empty()) {
|
||||
geo_b = true;
|
||||
|
||||
/* Compile the vertex shader */
|
||||
geometry_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(geometry_shader, 1, &src_code, NULL);
|
||||
src_code = load_shader_program_from_file(this->geometry_file);
|
||||
c_string = src_code.c_str();
|
||||
|
||||
/* Compile the vertex shader */
|
||||
geometry_shader = glCreateShader(GL_GEOMETRY_SHADER);
|
||||
glShaderSource(geometry_shader, 1, &c_string, NULL);
|
||||
glCompileShader(geometry_shader);
|
||||
glGetShaderiv(geometry_shader, GL_COMPILE_STATUS, &success);
|
||||
free(src_code);
|
||||
|
||||
if (!success) {
|
||||
glGetShaderInfoLog(geometry_shader, 512, NULL, info_log);
|
||||
@@ -78,12 +91,14 @@ int OpenGlShaderProgram::compile()
|
||||
if (!this->fragment_file.empty()) {
|
||||
frag_b = true;
|
||||
|
||||
/* Compile the vertex shader */
|
||||
fragment_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(fragment_shader, 1, &src_code, NULL);
|
||||
src_code = load_shader_program_from_file(this->fragment_file);
|
||||
c_string = src_code.c_str();
|
||||
|
||||
/* Compile the vertex shader */
|
||||
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(fragment_shader, 1, &c_string, NULL);
|
||||
glCompileShader(fragment_shader);
|
||||
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
|
||||
free(src_code);
|
||||
|
||||
if (!success) {
|
||||
glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
|
||||
@@ -141,3 +156,27 @@ int OpenGlShaderProgram::use()
|
||||
glUseProgram(this->shader_program);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void OpenGlShaderProgram::setUniformFloat(const std::string &uniform, float value)
|
||||
{
|
||||
int loc = this->getUniformLoc(uniform);
|
||||
if (loc >= 0) {
|
||||
glUniform1f(loc, value);
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGlShaderProgram::setUniformVec2(const std::string &uniform, float *vector)
|
||||
{
|
||||
int loc = this->getUniformLoc(uniform);
|
||||
if (loc >= 0) {
|
||||
glUniform2fv(loc, 1, vector);
|
||||
}
|
||||
}
|
||||
|
||||
int OpenGlShaderProgram::getUniformLoc(const std::string &uniform)
|
||||
{
|
||||
if (!this->compiled)
|
||||
return -1;
|
||||
|
||||
return glGetUniformLocation(this->shader_program, uniform.c_str());
|
||||
}
|
||||
|
Reference in New Issue
Block a user