From 2e0e12140e95be18abf3cf7e54230ef22f410fbd Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Tue, 23 Aug 2022 14:40:02 -0400 Subject: effects can use gl state --- gl_calls.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 22 deletions(-) (limited to 'gl_calls.cpp') 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,12 +216,24 @@ 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) { @@ -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; +} -- cgit v1.2.3