Compare commits
2 Commits
4044ad9b36
...
80ec31a8ce
| Author | SHA1 | Date | |
|---|---|---|---|
| 80ec31a8ce | |||
| ae44554bf4 |
@@ -1,33 +1,35 @@
|
|||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
|
||||||
class FullScreenQuad {
|
class FullScreenQuad {
|
||||||
private:
|
private:
|
||||||
unsigned int vao;
|
unsigned int vao;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FullScreenQuad();
|
FullScreenQuad();
|
||||||
int getVAO() { return vao; }
|
int getVAO() { return vao; }
|
||||||
};
|
};
|
||||||
|
|
||||||
FullScreenQuad::FullScreenQuad() {
|
FullScreenQuad::FullScreenQuad() {
|
||||||
float quadVertices[] = { // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.
|
float quadVertices[] = {// vertex attributes for a quad that fills the
|
||||||
|
// entire screen in Normalized Device Coordinates.
|
||||||
// positions // texCoords
|
// positions // texCoords
|
||||||
-1.0f, 1.0f, 0.0f, 1.0f,
|
-1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f,
|
||||||
-1.0f, -1.0f, 0.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f,
|
||||||
1.0f, -1.0f, 1.0f, 0.0f,
|
|
||||||
|
-1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f,
|
||||||
|
1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
-1.0f, 1.0f, 0.0f, 1.0f,
|
|
||||||
1.0f, -1.0f, 1.0f, 0.0f,
|
|
||||||
1.0f, 1.0f, 1.0f, 1.0f
|
|
||||||
};
|
|
||||||
unsigned int vbo;
|
unsigned int vbo;
|
||||||
glGenVertexArrays(1, &vao);
|
glGenVertexArrays(1, &vao);
|
||||||
glGenBuffers(1, &vbo);
|
glGenBuffers(1, &vbo);
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices,
|
||||||
|
GL_STATIC_DRAW);
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
|
||||||
|
(void *)0);
|
||||||
glEnableVertexAttribArray(1);
|
glEnableVertexAttribArray(1);
|
||||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
|
||||||
|
(void *)(2 * sizeof(float)));
|
||||||
}
|
}
|
||||||
|
|||||||
27
main.cpp
27
main.cpp
@@ -1,8 +1,7 @@
|
|||||||
|
#include "FullScreenQuad.hpp"
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include "FullScreenQuad.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
const char *vertexShaderSource =
|
const char *vertexShaderSource =
|
||||||
#include "fsq.vs"
|
#include "fsq.vs"
|
||||||
@@ -17,13 +16,11 @@ const char *fragmentShaderSource =
|
|||||||
glViewport(0, 0, wdth, height);
|
glViewport(0, 0, wdth, height);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
void processInput(GLFWwindow *window)
|
void processInput(GLFWwindow *window) {
|
||||||
{
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
||||||
glfwSetWindowShouldClose(window, true);
|
glfwSetWindowShouldClose(window, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int compVertexShader() {
|
unsigned int compVertexShader() {
|
||||||
unsigned int vertexShader;
|
unsigned int vertexShader;
|
||||||
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
@@ -38,10 +35,10 @@ unsigned int compFragmentShader() {
|
|||||||
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
|
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
|
||||||
glCompileShader(fragmentShader);
|
glCompileShader(fragmentShader);
|
||||||
|
|
||||||
|
// Print shader comp error
|
||||||
GLint isCompiled = 0;
|
GLint isCompiled = 0;
|
||||||
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
|
||||||
if(isCompiled == GL_FALSE)
|
if (isCompiled == GL_FALSE) {
|
||||||
{
|
|
||||||
GLint maxLength = 0;
|
GLint maxLength = 0;
|
||||||
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
|
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
|
||||||
|
|
||||||
@@ -51,7 +48,6 @@ unsigned int compFragmentShader() {
|
|||||||
glGetShaderInfoLog(fragmentShader, maxLength, &maxLength, errorLog);
|
glGetShaderInfoLog(fragmentShader, maxLength, &maxLength, errorLog);
|
||||||
|
|
||||||
printf("\nFrag Log: %s\n", errorLog);
|
printf("\nFrag Log: %s\n", errorLog);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return fragmentShader;
|
return fragmentShader;
|
||||||
@@ -72,9 +68,7 @@ unsigned int compShader() {
|
|||||||
return shaderProgram;
|
return shaderProgram;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
|
||||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
|
||||||
{
|
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,8 +81,7 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
|
window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
|
||||||
|
|
||||||
if (!window)
|
if (!window) {
|
||||||
{
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -101,26 +94,21 @@ int main(int argc, char** argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
glViewport(0, 0, 800, 600);
|
glViewport(0, 0, 800, 600);
|
||||||
|
|
||||||
|
|
||||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||||
|
|
||||||
unsigned int shaderProgramm = compShader();
|
unsigned int shaderProgramm = compShader();
|
||||||
|
|
||||||
FullScreenQuad fsq{};
|
FullScreenQuad fsq{};
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window)) {
|
||||||
{
|
|
||||||
processInput(window);
|
processInput(window);
|
||||||
/* Render here */
|
/* Render here */
|
||||||
|
|
||||||
|
|
||||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
|
||||||
glUseProgram(shaderProgramm);
|
glUseProgram(shaderProgramm);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
@@ -135,4 +123,3 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
69
sdf.fs
69
sdf.fs
@@ -7,29 +7,70 @@ in vec2 texCoords;
|
|||||||
vec3 center = vec3(0.0f,0.0f,20.0f);
|
vec3 center = vec3(0.0f,0.0f,20.0f);
|
||||||
float radius = 5.0f;
|
float radius = 5.0f;
|
||||||
|
|
||||||
float sphereMin(vec3 pos){
|
float planeHeight = -7.0f;
|
||||||
return length(pos - center) - radius;
|
|
||||||
|
struct Ray {
|
||||||
|
vec3 dir;
|
||||||
|
vec3 pos;
|
||||||
|
float min;
|
||||||
|
float len;
|
||||||
|
vec3 color;
|
||||||
|
};
|
||||||
|
|
||||||
|
Ray applyMin(Ray ray) {
|
||||||
|
vec3 off = ray.dir * ray.min;
|
||||||
|
ray.pos = ray.pos + off;
|
||||||
|
ray.len = ray.len + ray.min;
|
||||||
|
return ray;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Ray planeMin(Ray ray){
|
||||||
|
ray.min = ray.pos.y - planeHeight;
|
||||||
|
ray.color = vec3(1.0,1.0,1.0);
|
||||||
|
return applyMin(ray);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ray sphereMin(Ray ray){
|
||||||
|
ray.min = length(ray.pos - center) - radius;
|
||||||
|
ray.color = vec3(1.0,0.0,0.0);
|
||||||
|
return applyMin(ray);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ray minFn(Ray ray){
|
||||||
|
Ray sp = sphereMin(ray);
|
||||||
|
Ray pl = planeMin(ray);
|
||||||
|
|
||||||
|
if (sp.min < pl.min){
|
||||||
|
return sp;
|
||||||
|
} else {
|
||||||
|
return pl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec3 ray = vec3(texCoords.x, texCoords.y,2.0f);
|
vec3 dir = vec3(texCoords.x, texCoords.y,2.0f);
|
||||||
ray = (ray - 0.5f) * 2;
|
dir = (dir - 0.5f) * 2;
|
||||||
vec3 pos = ray;
|
vec3 pos = dir;
|
||||||
float min = sphereMin(ray);
|
Ray ray = Ray(pos,normalize(dir),.0,.0,vec3(.0));
|
||||||
|
|
||||||
|
|
||||||
|
ray = minFn(ray);
|
||||||
|
|
||||||
|
while( (ray.min < 100.0f) && (ray.min > 0.1f) ) {
|
||||||
|
//ray.dir = normalize(ray.dir);
|
||||||
|
ray = minFn(ray);
|
||||||
|
//vec3 off = ray.dir * min;
|
||||||
|
//ray.pos = ray.pos + off;
|
||||||
|
|
||||||
while( (min < 100.0f) && (min > 0.1f) ) {
|
|
||||||
ray = normalize(ray);
|
|
||||||
ray = ray * min;
|
|
||||||
pos = pos + ray;
|
|
||||||
min = sphereMin(pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(min <= 0.2f){
|
if(ray.min <= 0.2f){
|
||||||
FragColor = vec4(texCoords.x, texCoords.y, 0.2f, 1.0f);
|
FragColor = vec4(ray.color, 1.0f);
|
||||||
} else {
|
} else {
|
||||||
FragColor = vec4(0.0f,0.0f,0.0f,1.0f);
|
FragColor = vec4(.0,0.0f,0.0f,1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user