Sure, I post the whole code it’s short.
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
#include <cassert>
#define WIDTH 800
#define HEIGHT 480
using namespace std;
static void init();
static void initShaderProgram();
static void allocateSSBO();
static void display();
static void reshape(int,int);
static const char *vertexShader = R"(
#version 430
layout(location = 0) in vec2 Vertex;
void main() {
gl_Position = vec4(Vertex, 0.0, 1.0);
}
)";
static const char *fragmentShader = R"(
#version 430
layout(std430, binding = 0) buffer ColorSSBO {
float color[];
};
out vec4 FragmentColor;
void main() {
FragmentColor = vec4(color[0], color[1], color[2], 1.0);
}
)";
static int window;
static GLuint shaders[3];
static GLuint vao;
static GLuint vbo;
static GLuint ssbo;
static void __stdcall DebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam) {
cout << message << endl;
}
void init() {
// Init FreeGLUT
int temp = 0;
glutInit(&temp, nullptr);
glutInitContextVersion(4, 3);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInitContextFlags(GLUT_DEBUG);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(WIDTH, HEIGHT);
window = glutCreateWindow("LinkedList-OIT");
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glClearColor(0, 0, 0, 1);
// Init GLEW
glewExperimental = GL_TRUE;
GLenum outcome = glewInit();
if(outcome != GL_NO_ERROR)
exit(-1);
glGetError();
initShaderProgram();
glDebugMessageCallback((GLDEBUGPROC)DebugCallback, nullptr);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
// Init center triangle
float triangle[] = {
+0.00, +0.67,
+0.67, -0.67,
-0.67, -0.67
};
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 2*sizeof(float)*3, triangle, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// Print debug info
cout << glGetString(GL_VERSION) << endl;
}
static void checkShader(GLuint shader) {
// Standard shader validation
}
static void checkProgram(GLuint program) {
// Standard program validation
}
void initShaderProgram() {
// Init vertex shader
shaders[0] = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(shaders[0], 1, &vertexShader, nullptr);
glCompileShader(shaders[0]);
checkShader(shaders[0]);
// Init fragment shader
shaders[1] = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(shaders[1], 1, &fragmentShader, nullptr);
glCompileShader(shaders[1]);
checkShader(shaders[1]);
// Link program
shaders[2] = glCreateProgram();
glAttachShader(shaders[2], shaders[0]);
glAttachShader(shaders[2], shaders[1]);
glLinkProgram(shaders[2]);
checkProgram(shaders[2]);
// Bind the compiled program
glUseProgram(shaders[2]);
}
void allocateSSBO() {
// Build and populate
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
float color[] = {1.f, 1.f, 1.f};
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(float), color, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
assert(glGetError() == GL_NO_ERROR);
}
void reshape(int width, int height) {
glViewport(0, 0, width, height);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glutSwapBuffers();
glutPostRedisplay();
}
int main(int argc, char **argv) {
init();
allocateSSBO();
glutMainLoop();
}
Thank you for this.