summaryrefslogtreecommitdiff
path: root/gl_calls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gl_calls.cpp')
-rw-r--r--gl_calls.cpp134
1 files changed, 89 insertions, 45 deletions
diff --git a/gl_calls.cpp b/gl_calls.cpp
index 85ce0b3..4474b44 100644
--- a/gl_calls.cpp
+++ b/gl_calls.cpp
@@ -1,4 +1,4 @@
-const char *vertexShaderSource = "#version 330 core\n"
+const char *DefaultVertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"layout (location = 1) in vec2 aTexCoord;\n"
"out vec2 TexCoord;\n"
@@ -7,7 +7,26 @@ const char *vertexShaderSource = "#version 330 core\n"
" gl_Position = vec4(aPos, 1.0);\n"
" TexCoord = aTexCoord;\n"
"}\0";
-
+const char *MaskVertexShaderSource = "#version 330 core\n"
+"layout (location = 0) in vec3 aPos;\n"
+"layout (location = 1) in vec2 aTexCoord;\n"
+"out vec2 TexCoord;\n"
+"uniform vec3 CompDimensions;\n"
+"void main()\n"
+"{\n"
+" gl_Position = vec4(vec2(aPos.x / CompDimensions.x, aPos.y / CompDimensions.y) * 2 - 1.0f, 0.0f, 1.0);\n"
+" TexCoord = aTexCoord;\n"
+"}\0";
+const char *DefaultFragmentShaderSource = "#version 330 core\n"
+"out vec4 FragColor;\n"
+"in vec2 TexCoord;\n"
+"uniform sampler2D Texture;\n"
+"void main()\n"
+"{\n"
+"vec4 ColTest = texture(Texture, TexCoord);\n"
+"ColTest.r += 0.5f;\n"
+"FragColor = ColTest;\n"
+"}\0";
#if 0
const char *fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
@@ -30,7 +49,6 @@ const char *fragmentShaderSource = "#version 330 core\n"
"vec4 ValG = 1.0f / (End - Start) * (ColorG - Start);\n"
"FragColor = clamp(ValG, 0.0f, 1.0f);\n"
"}\0";
-#else
const char *fragmentShaderSource = "#version 330 core\n"
"uniform float Radius;\n"
"uniform vec2 Direction;\n"
@@ -57,78 +75,95 @@ const char *fragmentShaderSource = "#version 330 core\n"
#endif
-static void TestGL_InitShader() {
- TGL.VertexShader = glCreateShader(GL_VERTEX_SHADER);
+static void TestGL_InitDefaultShader() {
+ DefaultVertexShader = glCreateShader(GL_VERTEX_SHADER);
- // We have to compile our shaders before executing them.
- glShaderSource(TGL.VertexShader, 1, &vertexShaderSource, NULL);
- glCompileShader(TGL.VertexShader);
+ glShaderSource(DefaultVertexShader, 1, &DefaultVertexShaderSource, NULL);
+ glCompileShader(DefaultVertexShader);
int success;
char infoLog[512];
- glGetShaderiv(TGL.VertexShader, GL_COMPILE_STATUS, &success);
+ glGetShaderiv(DefaultVertexShader, GL_COMPILE_STATUS, &success);
if(!success)
{
- glGetShaderInfoLog(TGL.VertexShader, 512, NULL, infoLog);
+ glGetShaderInfoLog(DefaultVertexShader, 512, NULL, infoLog);
printf("Vertex shader fail:\n %s", infoLog);
}
- TGL.FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+ uint32 DefaultFragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(TGL.FragmentShader, 1, &fragmentShaderSource, NULL);
- glCompileShader(TGL.FragmentShader);
+ glShaderSource(DefaultFragmentShader, 1, &DefaultFragmentShaderSource, NULL);
+ glCompileShader(DefaultFragmentShader);
- glGetShaderiv(TGL.FragmentShader, GL_COMPILE_STATUS, &success);
+ glGetShaderiv(DefaultFragmentShader, GL_COMPILE_STATUS, &success);
if(!success)
{
- glGetShaderInfoLog(TGL.FragmentShader, 512, NULL, infoLog);
+ glGetShaderInfoLog(DefaultFragmentShader, 512, NULL, infoLog);
printf("Fragment shader fail:\n %s", infoLog);
}
// Shader programs link both types of shaders together.
- TGL.ShaderProgram = glCreateProgram();
+ DefaultShaderProgram = glCreateProgram();
+
+ glAttachShader(DefaultShaderProgram, DefaultVertexShader);
+ glAttachShader(DefaultShaderProgram, DefaultFragmentShader);
+ glLinkProgram(DefaultShaderProgram);
+
+ glGetProgramiv(DefaultShaderProgram, GL_LINK_STATUS, &success);
+ if(!success) {
+ glGetProgramInfoLog(DefaultShaderProgram, 512, NULL, infoLog);
+ printf("Shader linkage fail:\n %s", infoLog);
+ }
+
+ uint32 MaskVertexShader = glCreateShader(GL_VERTEX_SHADER);
- glAttachShader(TGL.ShaderProgram, TGL.VertexShader);
- glAttachShader(TGL.ShaderProgram, TGL.FragmentShader);
- glLinkProgram(TGL.ShaderProgram);
+ glShaderSource(MaskVertexShader, 1, &MaskVertexShaderSource, NULL);
+ glCompileShader(MaskVertexShader);
- glGetProgramiv(TGL.ShaderProgram, GL_LINK_STATUS, &success);
+ glGetShaderiv(MaskVertexShader, GL_COMPILE_STATUS, &success);
if(!success) {
- glGetProgramInfoLog(TGL.ShaderProgram, 512, NULL, infoLog);
+ glGetProgramInfoLog(DefaultShaderProgram, 512, NULL, infoLog);
printf("Shader linkage fail:\n %s", infoLog);
}
- // The shaders are no longer needed by anything once they're linked.
- glDeleteShader(TGL.VertexShader);
- glDeleteShader(TGL.FragmentShader);
+ MaskShaderProgram = glCreateProgram();
+ glAttachShader(MaskShaderProgram, MaskVertexShader);
+ glAttachShader(MaskShaderProgram, DefaultFragmentShader);
+ glLinkProgram(MaskShaderProgram);
+
+ glGetProgramiv(MaskShaderProgram, GL_LINK_STATUS, &success);
+ if(!success) {
+ glGetProgramInfoLog(MaskShaderProgram, 512, NULL, infoLog);
+ printf("Shader linkage fail:\n %s", infoLog);
+ }
+
+ // Default vertex shader is still needed to link to other effects.
+ glDeleteShader(DefaultFragmentShader);
+ glDeleteShader(MaskVertexShader);
}
-static void TestGL_InitVerts() {
+static void TestGL_InitDefaultVerts() {
- float GLVertices[] = {
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- };
unsigned int GLIndices[] = {
0, 1, 3,
1, 2, 3
};
// Indices!
- glGenBuffers(1, &TGL.EBO);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, TGL.EBO);
+ glGenVertexArrays(1, &DefaultVerts.VertexArrayObject);
+
+ glGenBuffers(1, &DefaultVerts.ElementBufferObject);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, DefaultVerts.ElementBufferObject);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLIndices), GLIndices,
GL_STATIC_DRAW);
- glGenBuffers(1, &TGL.VBO);
+ glGenBuffers(1, &DefaultVerts.VertexBufferObject);
// Our vertices need to be stored in this buffer.
- glBindBuffer(GL_ARRAY_BUFFER, TGL.VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(GLVertices), GLVertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, DefaultVerts.VertexBufferObject);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(DefaultVertices), DefaultVertices, GL_STATIC_DRAW);
// position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
@@ -150,21 +185,30 @@ TestGL_InitTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Heigh
glViewport(0, 0, Width, Height);
- glGenFramebuffers(1, &Test->FBO);
- glGenRenderbuffers(1, &Test->RBO);
+ glGenFramebuffers(1, &Test->FramebufferObject);
- glBindRenderbuffer(GL_RENDERBUFFER, Test->RBO);
+ glGenRenderbuffers(1, &Test->Color_Renderbuffer);
+ glBindRenderbuffer(GL_RENDERBUFFER, Test->Color_Renderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, Width, Height);
- glBindFramebuffer(GL_FRAMEBUFFER, Test->FBO);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, Test->RBO);
+ GLuint Stencil_Renderbuffer = 0;
+ glGenRenderbuffers(1, &Stencil_Renderbuffer);
+ glBindRenderbuffer( GL_RENDERBUFFER, (GLuint)Stencil_Renderbuffer );
+ glRenderbufferStorage( GL_RENDERBUFFER, GL_STENCIL_INDEX8, Width, Height );
+
+ glBindFramebuffer(GL_FRAMEBUFFER, Test->FramebufferObject);
+
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, Test->Color_Renderbuffer);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, Stencil_Renderbuffer);
+
+ GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE) {
+ printf("incomplete framebuffer");
+ Assert(0);
+ }
- // Non-POT textures with RGB instead of RGBA doesn't seem to work, but
- // since I don't plan on storing bitmaps that way (AVX2 is much more
- // efficient with RGBA) it doesn't really matter.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, Data);
- // glGenerateMipmap(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}