Add shader program structure
This commit is contained in:
parent
a0f76d35d7
commit
29c71cff88
6 changed files with 28 additions and 40 deletions
3
data/shaders/textured/attrib.txt
Normal file
3
data/shaders/textured/attrib.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
position
|
||||||
|
tex_coord
|
||||||
|
normal
|
24
src/main.cpp
24
src/main.cpp
|
@ -11,8 +11,6 @@
|
||||||
#include <emscripten/emscripten.h>
|
#include <emscripten/emscripten.h>
|
||||||
#include <emscripten/html5.h>
|
#include <emscripten/html5.h>
|
||||||
|
|
||||||
static Program build_program();
|
|
||||||
|
|
||||||
static void iterate();
|
static void iterate();
|
||||||
|
|
||||||
static GLFWCALL void on_key(int key, int action);
|
static GLFWCALL void on_key(int key, int action);
|
||||||
|
@ -56,7 +54,7 @@ int main()
|
||||||
glfwSetKeyCallback(on_key);
|
glfwSetKeyCallback(on_key);
|
||||||
emscripten_set_mousemove_callback(nullptr, nullptr, false, on_em_mousemove);
|
emscripten_set_mousemove_callback(nullptr, nullptr, false, on_em_mousemove);
|
||||||
|
|
||||||
Program program = build_program();
|
Program program("textured");
|
||||||
program.use();
|
program.use();
|
||||||
|
|
||||||
mvp_uniform = program.get_uniform_location("mvp");
|
mvp_uniform = program.get_uniform_location("mvp");
|
||||||
|
@ -94,26 +92,6 @@ int main()
|
||||||
emscripten_set_main_loop(iterate, 0, 1);
|
emscripten_set_main_loop(iterate, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Program build_program()
|
|
||||||
{
|
|
||||||
const Shader vertex_shader = Shader(GL_VERTEX_SHADER, "/data/shaders/vertex.glsl");
|
|
||||||
const Shader fragment_shader = Shader(GL_FRAGMENT_SHADER, "/data/shaders/fragment.glsl");
|
|
||||||
|
|
||||||
Program program;
|
|
||||||
program.attach_shader(vertex_shader);
|
|
||||||
program.attach_shader(fragment_shader);
|
|
||||||
program.bind_attrib_location(0, "position");
|
|
||||||
program.bind_attrib_location(1, "tex_coord");
|
|
||||||
program.bind_attrib_location(2, "normal");
|
|
||||||
program.link();
|
|
||||||
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
glEnableVertexAttribArray(1);
|
|
||||||
glEnableVertexAttribArray(2);
|
|
||||||
|
|
||||||
return program;
|
|
||||||
}
|
|
||||||
|
|
||||||
void iterate()
|
void iterate()
|
||||||
{
|
{
|
||||||
if (keys['W'])
|
if (keys['W'])
|
||||||
|
|
|
@ -1,23 +1,34 @@
|
||||||
#include "program.hpp"
|
#include "program.hpp"
|
||||||
|
|
||||||
Program::Program()
|
#include "shader.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
Program::Program(const char *const name)
|
||||||
{
|
{
|
||||||
|
const std::string path = std::string("/data/shaders/") + name + '/';
|
||||||
|
|
||||||
|
const Shader vertex_shader = Shader(GL_VERTEX_SHADER, (path + "vertex.glsl").c_str());
|
||||||
|
const Shader fragment_shader = Shader(GL_FRAGMENT_SHADER, (path + "fragment.glsl").c_str());
|
||||||
|
|
||||||
_id = glCreateProgram();
|
_id = glCreateProgram();
|
||||||
}
|
|
||||||
|
|
||||||
void Program::attach_shader(const Shader &shader)
|
glAttachShader(_id, vertex_shader.id());
|
||||||
{
|
glAttachShader(_id, fragment_shader.id());
|
||||||
glAttachShader(_id, shader.id());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Program::bind_attrib_location(const GLuint index, const GLchar *const name)
|
std::ifstream file(path + "attrib.txt", std::ios::in);
|
||||||
{
|
|
||||||
glBindAttribLocation(_id, index, name);
|
std::string line;
|
||||||
}
|
int index = 0;
|
||||||
|
|
||||||
|
while (std::getline(file, line))
|
||||||
|
glBindAttribLocation(_id, index++, line.c_str());
|
||||||
|
|
||||||
void Program::link()
|
|
||||||
{
|
|
||||||
glLinkProgram(_id);
|
glLinkProgram(_id);
|
||||||
|
|
||||||
|
for (int i = 0; i < index; ++i)
|
||||||
|
glEnableVertexAttribArray(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Program::use() const
|
void Program::use() const
|
||||||
|
|
|
@ -2,15 +2,11 @@
|
||||||
#define _PROGRAM_HPP_
|
#define _PROGRAM_HPP_
|
||||||
|
|
||||||
#include "gl.hpp"
|
#include "gl.hpp"
|
||||||
#include "shader.hpp"
|
|
||||||
|
|
||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Program();
|
Program(const char *name);
|
||||||
void attach_shader(const Shader &shader);
|
|
||||||
void bind_attrib_location(GLuint index, const GLchar *name);
|
|
||||||
void link();
|
|
||||||
void use() const;
|
void use() const;
|
||||||
GLuint get_uniform_location(const GLchar *name) const;
|
GLuint get_uniform_location(const GLchar *name) const;
|
||||||
|
|
||||||
|
|
Reference in a new issue