&globe &globe v2
This commit is contained in:
parent
7a0731545f
commit
ed9b5d97f8
3 changed files with 54 additions and 20 deletions
|
@ -218,29 +218,36 @@ int main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
glClearColor(0.25, 0.25, 0.25, 1);
|
glClearColor(0.25, 0.25, 0.25, 1);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
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);
|
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
|
||||||
glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), -1);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
const float increment = -1.0f/60.0f;
|
||||||
|
float globe0Offset = 0;
|
||||||
|
float globe1Offset = 0;
|
||||||
|
while (!glfwWindowShouldClose(window)) {
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), 1);
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aHorizontalOffset"), globe0Offset);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
square.draw();
|
square.draw();
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), 1);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), -1);
|
||||||
|
glUniform1f(glGetUniformLocation(shader.id, "aHorizontalOffset"), globe1Offset);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
glBindTexture(GL_TEXTURE_2D, colorBuffer);
|
||||||
square.draw();
|
square.draw();
|
||||||
|
|
||||||
|
globe0Offset += increment;
|
||||||
|
if (globe0Offset <= -2)
|
||||||
|
globe0Offset = 0;
|
||||||
|
globe1Offset = globe0Offset * 0.5f;
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,19 @@
|
||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
in vec2 vFragCoord;
|
in vec2 vFragCoord;
|
||||||
|
in vec2 vTexCoord;
|
||||||
uniform float aHorizontalOffset;
|
|
||||||
uniform sampler2D aTexture;
|
uniform sampler2D aTexture;
|
||||||
|
uniform float aHorizontalOffset;
|
||||||
|
|
||||||
|
// Set to 1 or -1 to flip Y
|
||||||
|
uniform float aTexCoordYScale;
|
||||||
|
|
||||||
|
// Adds the Z value to a vec2, calculating it assuming
|
||||||
|
// it's a sphere with a radius of 2
|
||||||
|
vec3 getZInSphere(vec2 v) {
|
||||||
|
const float radius = 2;
|
||||||
|
return vec3(v, sqrt(radius-dot(v,v)));
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
float distanceFromCenterSquared = dot(vFragCoord, vFragCoord);
|
float distanceFromCenterSquared = dot(vFragCoord, vFragCoord);
|
||||||
|
@ -28,10 +38,30 @@ void main() {
|
||||||
// alpha = 1 if fragment is inside circle
|
// alpha = 1 if fragment is inside circle
|
||||||
float alpha = distanceFromCenterSquared > 1 ? 0 : 1;
|
float alpha = distanceFromCenterSquared > 1 ? 0 : 1;
|
||||||
|
|
||||||
// An equation which seems to work
|
vec3 normal;
|
||||||
float specular = distanceFromCenterSquared * (-0.5f*vFragCoord.x + vFragCoord.y) + 1;
|
{
|
||||||
|
// Form a triangle to approximate the normal or something like that
|
||||||
|
const float offset = 0.001;
|
||||||
|
vec3 p0 = getZInSphere(vFragCoord + vec2(0, offset));
|
||||||
|
vec3 p1 = getZInSphere(vFragCoord + vec2(offset, -offset));
|
||||||
|
vec3 p2 = getZInSphere(vFragCoord + vec2(-offset, -offset));
|
||||||
|
|
||||||
vec2 texCoord = vFragCoord * vec2(0.5,0.5) + vec2(0.5+aHorizontalOffset,0.5);
|
// Now calculate the normal of the triangle
|
||||||
|
vec3 a = p0 - p1;
|
||||||
|
vec3 b = p2 - p1;
|
||||||
|
normal = normalize(cross(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
gl_FragColor = vec4(texture(aTexture, texCoord).xyz*specular, alpha);
|
const float pi = radians(180);
|
||||||
|
// Based off of https://stackoverflow.com/questions/41957890/how-to-properly-map-a-2d-image-texture-to-an-icosphere
|
||||||
|
vec2 texCoord = vec2(
|
||||||
|
atan(normal.x, normal.z) * (1.0f/pi),
|
||||||
|
asin(-normal.y) * (2.0f/pi) * aTexCoordYScale
|
||||||
|
) + vec2(0.5f+aHorizontalOffset, 0.5f);
|
||||||
|
|
||||||
|
// Some equation which seems to work good enough
|
||||||
|
float specular = (dot(normal, normalize(vec3(-1, 2, 0.5f))) - 0.25f) * 1.3f + 0.1f;
|
||||||
|
specular = specular*specular * sign(specular);
|
||||||
|
|
||||||
|
gl_FragColor = vec4(texture(aTexture, texCoord).rgb + (vec3(1,1,1) * specular), alpha);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,10 +20,7 @@ layout (location = 0) in vec2 aPosition;
|
||||||
|
|
||||||
out vec2 vFragCoord;
|
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);
|
||||||
vFragCoord = aPosition * vec2(1, aTexCoordYScale);
|
vFragCoord = aPosition;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue