&globe &globe
This commit is contained in:
parent
1fdde43b57
commit
7a0731545f
5 changed files with 78 additions and 18 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +1,6 @@
|
||||||
[submodule "digraphene-headers"]
|
[submodule "digraphene-headers"]
|
||||||
path = digraphene-headers
|
path = digraphene-headers
|
||||||
url = https://gitlab.com/TestingPlant/digraphene-headers.git
|
url = https://gitlab.com/TestingPlant/digraphene-headers.git
|
||||||
|
[submodule "stb"]
|
||||||
|
path = stb
|
||||||
|
url = https://github.com/nothings/stb.git
|
||||||
|
|
|
@ -14,13 +14,14 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#include <stb_image.h>
|
||||||
#include <mesh.h>
|
#include <mesh.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <shader.h>
|
#include <shader.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <type_traits>
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
linalg::aliases::float2 position;
|
linalg::aliases::float2 position;
|
||||||
|
@ -122,6 +123,16 @@ int main() {
|
||||||
GLFWwindow* window = glfwCreateWindow(resultLength, resultLength, "You aren't supposed to see this", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(resultLength, resultLength, "You aren't supposed to see this", NULL, NULL);
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
|
int contextFlags;
|
||||||
|
glGetIntegerv(GL_CONTEXT_FLAGS, &contextFlags);
|
||||||
|
if (contextFlags & GL_CONTEXT_FLAG_DEBUG_BIT) {
|
||||||
|
glEnable(GL_DEBUG_OUTPUT);
|
||||||
|
glDebugMessageCallback(onDebugOutput, NULL);
|
||||||
|
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
|
||||||
|
} else {
|
||||||
|
std::cerr << "Warning: Debug context could not be created.\n";
|
||||||
|
}
|
||||||
|
|
||||||
// Load a square
|
// Load a square
|
||||||
/*
|
/*
|
||||||
0--1
|
0--1
|
||||||
|
@ -170,13 +181,15 @@ int main() {
|
||||||
shader.use();
|
shader.use();
|
||||||
|
|
||||||
// Set up a framebuffer
|
// Set up a framebuffer
|
||||||
/*unsigned int frameBuffer;
|
unsigned int frameBuffer;
|
||||||
glGenFramebuffers(1, &frameBuffer);
|
glGenFramebuffers(1, &frameBuffer);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
|
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
|
||||||
unsigned int colorBuffer;
|
unsigned int colorBuffer;
|
||||||
glGenTextures(1, &colorBuffer);
|
glGenTextures(1, &colorBuffer);
|
||||||
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, resultLength, resultLength, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resultLength, resultLength, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0);
|
||||||
unsigned int renderBuffer;
|
unsigned int renderBuffer;
|
||||||
glGenRenderbuffers(1, &renderBuffer);
|
glGenRenderbuffers(1, &renderBuffer);
|
||||||
|
@ -185,13 +198,48 @@ int main() {
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
|
||||||
|
|
||||||
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE && "Generated framebuffer is incomplete");
|
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE && "Generated framebuffer is incomplete");
|
||||||
*/
|
|
||||||
|
|
||||||
glClearColor(0.5, 0, 0, 1);
|
unsigned int texture, normal;
|
||||||
glEnable(GL_BLEND);
|
// Load the image
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_SRC_ALPHA);
|
{
|
||||||
while (!glfwWindowShouldClose(window)) {
|
int width, height;
|
||||||
|
unsigned char* data = stbi_load("../test.png", &width, &height, nullptr, 0);
|
||||||
|
glGenTextures(1, &texture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||||
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
|
stbi_image_free(data);
|
||||||
|
|
||||||
|
glUniform1i(glGetUniformLocation(shader.id, "aTexture"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
glClearColor(0.25, 0.25, 0.25, 1);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
const float increment = -1.0f/30.0f;
|
||||||
|
float offset = 0;
|
||||||
|
while (!glfwWindowShouldClose(window)) {
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aHorizontalOffset"), offset);
|
||||||
|
offset += increment;
|
||||||
|
if (offset <= -1)
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), -1);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
square.draw();
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), 1);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
||||||
square.draw();
|
square.draw();
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
|
@ -5,28 +5,33 @@
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
in vec2 vTexCoord;
|
in vec2 vFragCoord;
|
||||||
|
|
||||||
uniform sampler2D aTexture0;
|
uniform float aHorizontalOffset;
|
||||||
|
uniform sampler2D aTexture;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
/*
|
float distanceFromCenterSquared = dot(vFragCoord, vFragCoord);
|
||||||
dot(vTexCoord, vTexCoord)
|
|
||||||
essentially does pow(length(gl_FragCoord.xy),2), but
|
|
||||||
(probably) more optimized
|
|
||||||
|
|
||||||
We're doing this since we don't want fragments outside a circle
|
// alpha = 0 if fragment is outside circle
|
||||||
*/
|
// alpha = 1 if fragment is inside circle
|
||||||
float alpha = dot(vTexCoord, vTexCoord) > 1 ? 1 : 0;
|
float alpha = distanceFromCenterSquared > 1 ? 0 : 1;
|
||||||
|
|
||||||
gl_FragColor = vec4(0, 0, 0, alpha);
|
// An equation which seems to work
|
||||||
|
float specular = distanceFromCenterSquared * (-0.5f*vFragCoord.x + vFragCoord.y) + 1;
|
||||||
|
|
||||||
|
vec2 texCoord = vFragCoord * vec2(0.5,0.5) + vec2(0.5+aHorizontalOffset,0.5);
|
||||||
|
|
||||||
|
gl_FragColor = vec4(texture(aTexture, texCoord).xyz*specular, alpha);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,12 @@
|
||||||
|
|
||||||
layout (location = 0) in vec2 aPosition;
|
layout (location = 0) in vec2 aPosition;
|
||||||
|
|
||||||
out vec2 vTexCoord;
|
out vec2 vFragCoord;
|
||||||
|
|
||||||
|
// Set to 1 or -1 to flip Y
|
||||||
|
uniform float aTexCoordYScale;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = vec4(aPosition, 0, 1);
|
gl_Position = vec4(aPosition, 0, 1);
|
||||||
vTexCoord = aPosition;
|
vFragCoord = aPosition * vec2(1, aTexCoordYScale);
|
||||||
}
|
}
|
||||||
|
|
1
stb
Submodule
1
stb
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit b42009b3b9d4ca35bc703f5310eedc74f584be58
|
Loading…
Reference in a new issue