From bc5375149c0ecb416848a2d3657ea41ae97177b3 Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Wed, 10 Aug 2022 21:24:03 -0400 Subject: path rasterization started with opengl --- gl_calls.cpp | 134 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 45 deletions(-) (limited to 'gl_calls.cpp') 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); } -- cgit v1.2.3