summaryrefslogtreecommitdiff
path: root/gl_calls.cpp
diff options
context:
space:
mode:
authorFox Caminiti <fox@foxcam.net>2022-08-23 14:40:02 -0400
committerFox Caminiti <fox@foxcam.net>2022-08-23 14:40:02 -0400
commit2e0e12140e95be18abf3cf7e54230ef22f410fbd (patch)
tree3cbbd9c31a87d96362c015aa6b649274dffb2235 /gl_calls.cpp
parente25257a0431ef475e5106f7534319b161b81fcae (diff)
effects can use gl state
Diffstat (limited to 'gl_calls.cpp')
-rw-r--r--gl_calls.cpp108
1 files changed, 86 insertions, 22 deletions
diff --git a/gl_calls.cpp b/gl_calls.cpp
index 8a7b905..d791a9c 100644
--- a/gl_calls.cpp
+++ b/gl_calls.cpp
@@ -1,6 +1,5 @@
#include "gl_calls.h"
-
const char *DefaultVertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"layout (location = 1) in vec2 aTexCoord;\n"
@@ -30,8 +29,8 @@ const char *DefaultFragmentShaderSource = "#version 330 core\n"
" FragColor = vec4(vec3(1.0f), Col.a);\n"
"}\n"
"}\0";
-#if 0
-const char *fragmentShaderSource = "#version 330 core\n"
+const char *FragmentShaderEffectSource[] = {"",
+"#version 330 core\n"
"out vec4 FragColor;\n"
"in vec2 TexCoord;\n"
"uniform float Start;\n"
@@ -47,12 +46,13 @@ const char *fragmentShaderSource = "#version 330 core\n"
// individual channels
"vec4 ColorI = pow(OutCol, MidCol);\n"
"vec4 ValI = 1.0f / (EndCol - StartCol) * (ColorI - StartCol);\n"
-// global channel
+// global channel (doesn't affect alpha)
"vec4 ColorG = pow(ValI, vec4(Mid));\n"
"vec4 ValG = 1.0f / (End - Start) * (ColorG - Start);\n"
+"ValG = vec4(ValG.rgb, ValI.a);\n"
"FragColor = clamp(ValG, 0.0f, 1.0f);\n"
-"}\0";
-const char *fragmentShaderSource = "#version 330 core\n"
+"}\0",
+"#version 330 core\n"
"uniform float Radius;\n"
"uniform vec2 Direction;\n"
"uniform sampler2D ourTexture;\n"
@@ -74,10 +74,13 @@ const char *fragmentShaderSource = "#version 330 core\n"
"}\n"
"void main(void) {\n"
" gl_FragColor = blur(ourTexture, TexCoord, vec2(1280, 720), Direction);\n"
-"}\0";
-#endif
+"}\0"
+};
+
+#include "effects_gl.cpp"
+
static void GL_InitDefaultShader() {
DefaultVertexShader = glCreateShader(GL_VERTEX_SHADER);
@@ -182,7 +185,7 @@ GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height,
glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
if (Multisample) {
- glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB, Width, Height, GL_TRUE);
+ // glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB, Width, Height, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
glBindRenderbuffer(GL_RENDERBUFFER, Test->Color_Renderbuffer);
@@ -191,6 +194,8 @@ GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height,
glBindRenderbuffer(GL_RENDERBUFFER, (GLuint)Test->Stencil_Renderbuffer );
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_STENCIL_INDEX8, Width, Height );
} else {
+ // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA,
+ // GL_UNSIGNED_BYTE, Data);
glBindTexture(GL_TEXTURE_2D, 0);
glBindRenderbuffer(GL_RENDERBUFFER, Test->Color_Renderbuffer);
@@ -211,13 +216,25 @@ GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height,
Assert(0);
}
- // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA,
- // GL_UNSIGNED_BYTE, Data);
-
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
static void
+GL_BindDefaultVertexArrays()
+{
+ // Switch to main buffer
+ glBindBuffer(GL_ARRAY_BUFFER, DefaultVerts.VertexBufferObject);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(GL_DefaultVertices), GL_DefaultVertices, GL_STATIC_DRAW);
+ // position attribute
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
+ glEnableVertexAttribArray(0);
+ // texture coordinate (note the last parameter's offset)
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
+ glEnableVertexAttribArray(1);
+
+}
+
+static void
GL_RasterizeShape(project_layer *Layer, mask *Mask)
{
gl_effect_layer Test = Layer->BitmapInfo.TestM;
@@ -283,16 +300,7 @@ GL_RasterizeShape(project_layer *Layer, mask *Mask)
glUniform1i(VertexMode, 0);
glUniform1i(FragmentMode, 1);
-
- // // Switch to main buffer
- glBindBuffer(GL_ARRAY_BUFFER, DefaultVerts.VertexBufferObject);
- glBufferData(GL_ARRAY_BUFFER, sizeof(GL_DefaultVertices), GL_DefaultVertices, GL_STATIC_DRAW);
- // position attribute
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- // texture coordinate (note the last parameter's offset)
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
+ GL_BindDefaultVertexArrays();
glStencilFunc(GL_NOTEQUAL, 0, 0xFF);
glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
@@ -312,3 +320,59 @@ GL_RasterizeShape(project_layer *Layer, mask *Mask)
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
+
+static uint16
+Effect_GL_InitShader(int EffectIndex)
+{
+ uint16 *ShaderProgram = &GL_EffectShaderProgram[EffectIndex];
+
+ // this is safe to do, riiight
+ if (*ShaderProgram) {
+ glUseProgram(*ShaderProgram);
+ return *ShaderProgram;
+ }
+
+ glShaderSource(DefaultVertexShader, 1, &DefaultVertexShaderSource, NULL);
+ glCompileShader(DefaultVertexShader);
+
+ int success;
+ char infoLog[512];
+ glGetShaderiv(DefaultVertexShader, GL_COMPILE_STATUS, &success);
+
+ if(!success)
+ {
+ glGetShaderInfoLog(DefaultVertexShader, 512, NULL, infoLog);
+ printf("Vertex shader fail:\n %s", infoLog);
+ }
+
+ uint32 FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+
+ glShaderSource(FragmentShader, 1, &FragmentShaderEffectSource[EffectIndex], NULL);
+ glCompileShader(FragmentShader);
+
+ glGetShaderiv(FragmentShader, GL_COMPILE_STATUS, &success);
+
+ if(!success)
+ {
+ glGetShaderInfoLog(FragmentShader, 512, NULL, infoLog);
+ printf("Fragment shader fail:\n %s", infoLog);
+ }
+
+ *ShaderProgram = glCreateProgram();
+
+ glAttachShader(*ShaderProgram, DefaultVertexShader);
+ glAttachShader(*ShaderProgram, FragmentShader);
+ glLinkProgram(*ShaderProgram);
+
+ glGetProgramiv(*ShaderProgram, GL_LINK_STATUS, &success);
+ if(!success) {
+ glGetProgramInfoLog(*ShaderProgram, 512, NULL, infoLog);
+ printf("Shader linkage fail:\n %s", infoLog);
+ }
+
+ glDeleteShader(FragmentShader);
+
+ glUseProgram(*ShaderProgram);
+
+ return *ShaderProgram;
+}