draw with OpenGL3 using a shader

This commit is contained in:
Josh Holtrop 2018-01-15 21:08:27 -05:00
parent 7ee6efe574
commit dca7d5a8b8
3 changed files with 96 additions and 28 deletions

6
box.f.glsl Normal file
View File

@ -0,0 +1,6 @@
uniform vec4 color;
void main(void)
{
gl_FragColor = color;
}

9
box.v.glsl Normal file
View File

@ -0,0 +1,9 @@
uniform float size;
uniform vec2 position;
attribute vec2 coord;
void main(void)
{
gl_Position = vec4(position + size * coord, 0, 1);
}

View File

@ -1,41 +1,78 @@
#include <SDL.h> #include <SDL.h>
#include <GL/gl.h> #include "glcxx.hpp"
#include <GL/glu.h> #include "GL3/gl3w.h"
#include <iostream>
#include <stdio.h> #include <stdio.h>
#define WIDTH 500 using namespace std;
#define HEIGHT 500
void init(void) #define WIDTH 800
#define HEIGHT 800
std::shared_ptr<glcxx::Program> program;
std::shared_ptr<glcxx::Buffer> box_buffer;
std::shared_ptr<glcxx::Array> box_array;
static struct
{
GLint size;
GLint color;
GLint position;
} uniforms;
int color = 0;
GLfloat size = 0.2;
GLfloat position[2] = {0.0, 0.0};
GLfloat colors[][4] = {
{1.0, 0.7, 0.0, 1.0},
{0.0, 0.5, 1.0, 1.0},
{1.0, 1.0, 0.0, 1.0},
{0.2, 0.2, 1.0, 1.0},
};
bool init(void)
{ {
glClearColor (0.0, 0.0, 0.0, 0.0); glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glViewport(0, 0, WIDTH, HEIGHT); glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION); try
glLoadIdentity(); {
glOrtho(-0.5, WIDTH - 0.5, -0.5, HEIGHT - 0.5, -1, 1); program = glcxx::Program::create(
glMatrixMode(GL_MODELVIEW); glcxx::Shader::create_from_file(GL_VERTEX_SHADER, "box.v.glsl"),
glLoadIdentity(); glcxx::Shader::create_from_file(GL_FRAGMENT_SHADER, "box.f.glsl"),
"coord", 0);
uniforms.size = program->get_uniform_location("size");
uniforms.color = program->get_uniform_location("color");
uniforms.position = program->get_uniform_location("position");
box_buffer = glcxx::Buffer::create(GL_ARRAY_BUFFER, GL_STATIC_DRAW,
{-1.0, -1.0,
1.0, -1.0,
1.0, 1.0,
-1.0, 1.0});
box_array = glcxx::Array::create();
box_array->bind();
box_buffer->bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
2 * sizeof(GLfloat), NULL);
}
catch (glcxx::Error & e)
{
cerr << "glcxx error: " << e.what() << endl;
return false;
}
return true;
} }
void display(SDL_Window * window) void display(SDL_Window * window)
{ {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1, 1, 1);
glBegin(GL_QUADS); program->use();
glVertex3f(10, HEIGHT / 2, 0.0); box_array->bind();
glVertex3f(10, 3 * HEIGHT / 4, 0.0); glUniform4fv(uniforms.color, 1, colors[color]);
glVertex3f(WIDTH / 2, 3 * HEIGHT / 4, 0.0); glUniform2fv(uniforms.position, 1, position);
glVertex3f(WIDTH / 2, HEIGHT / 2, 0.0); glUniform1f(uniforms.size, size);
glEnd(); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glColor3f(1, 0.6, 0);
glBegin(GL_LINE_LOOP);
glVertex2f(0, 0);
glVertex2f(WIDTH - 1, 0);
glVertex2f(WIDTH - 1, HEIGHT - 1);
glVertex2f(0, HEIGHT - 1);
glEnd();
SDL_GL_SwapWindow(window); SDL_GL_SwapWindow(window);
} }
@ -62,9 +99,25 @@ int main(int argc, char *argv[])
return 2; return 2;
} }
SDL_GLContext gl_context = SDL_GL_CreateContext(window); (void)SDL_GL_CreateContext(window);
if (gl3wInit())
{
cerr << "Failed to initialize GL3W" << endl;
return 2;
}
if (!gl3wIsSupported(3, 0))
{
cerr << "OpenGL 3.0 is not supported!" << endl;
return 2;
}
if (!init())
{
return 2;
}
init();
display(window); display(window);
SDL_Event event; SDL_Event event;
while (SDL_WaitEvent(&event)) while (SDL_WaitEvent(&event))