142 lines
3.5 KiB
C++
142 lines
3.5 KiB
C++
#include "FullScreenQuad.hpp"
|
|
#include "PerformanceAnalyser.hpp"
|
|
#include <GL/glew.h>
|
|
#include <GLFW/glfw3.h>
|
|
#include <cstdio>
|
|
#include <iostream>
|
|
|
|
const char *vertexShaderSource =
|
|
#include "fsq.glsl"
|
|
;
|
|
|
|
const char *fragmentShaderSource =
|
|
#include "sdf.glsl"
|
|
;
|
|
|
|
/*void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
|
{
|
|
glViewport(0, 0, wdth, height);
|
|
}*/
|
|
float aspect = 1.0;
|
|
|
|
void processInput(GLFWwindow *window) {
|
|
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
|
glfwSetWindowShouldClose(window, true);
|
|
}
|
|
|
|
unsigned int compVertexShader() {
|
|
unsigned int vertexShader;
|
|
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
|
|
glCompileShader(vertexShader);
|
|
return vertexShader;
|
|
}
|
|
|
|
unsigned int compFragmentShader() {
|
|
unsigned int fragmentShader;
|
|
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
|
|
glCompileShader(fragmentShader);
|
|
|
|
// Print shader comp error
|
|
GLint isCompiled = 0;
|
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
|
|
if (isCompiled == GL_FALSE) {
|
|
GLint maxLength = 0;
|
|
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
|
|
|
|
// The maxLength includes the NULL character
|
|
// std::vector<GLchar> errorLog(maxLength);
|
|
char *errorLog = new char[maxLength]();
|
|
glGetShaderInfoLog(fragmentShader, maxLength, &maxLength, errorLog);
|
|
|
|
printf("\nFrag Log: %s\n", errorLog);
|
|
}
|
|
|
|
return fragmentShader;
|
|
}
|
|
|
|
unsigned int compShader() {
|
|
unsigned int shaderProgram;
|
|
shaderProgram = glCreateProgram();
|
|
unsigned int vert = compVertexShader();
|
|
unsigned int frag = compFragmentShader();
|
|
glAttachShader(shaderProgram, vert);
|
|
glAttachShader(shaderProgram, frag);
|
|
glLinkProgram(shaderProgram);
|
|
|
|
glDeleteShader(vert);
|
|
glDeleteShader(frag);
|
|
|
|
return shaderProgram;
|
|
}
|
|
|
|
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
|
|
glViewport(0, 0, width, height);
|
|
aspect = float(width) / height;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
GLFWwindow *window;
|
|
|
|
if (!glfwInit())
|
|
return -1;
|
|
|
|
window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
|
|
|
|
if (!window) {
|
|
glfwTerminate();
|
|
return -1;
|
|
}
|
|
|
|
glfwMakeContextCurrent(window);
|
|
|
|
GLenum err = glewInit();
|
|
if (GLEW_OK != err) {
|
|
fprintf(stderr, "GLEW error: %s\n", glewGetErrorString(err));
|
|
return 1;
|
|
}
|
|
|
|
glViewport(0, 0, 800, 600);
|
|
|
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
|
|
|
unsigned int shaderProgram = compShader();
|
|
|
|
FullScreenQuad fsq{};
|
|
|
|
PerformanceAnalyser perf{};
|
|
|
|
double time = glfwGetTime();
|
|
|
|
while (!glfwWindowShouldClose(window)) {
|
|
|
|
time = glfwGetTime();
|
|
perf.update(time);
|
|
|
|
processInput(window);
|
|
/* Render here */
|
|
|
|
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
glUseProgram(shaderProgram);
|
|
|
|
int aspectLocation = glGetUniformLocation(shaderProgram, "aspect");
|
|
glUniform1f(aspectLocation, aspect);
|
|
int timeLocation = glGetUniformLocation(shaderProgram, "t");
|
|
glUniform1f(timeLocation, 2. * time);
|
|
|
|
glBindVertexArray(fsq.getVAO());
|
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
|
|
|
/* Poll for and process events */
|
|
glfwPollEvents();
|
|
|
|
glfwSwapBuffers(window);
|
|
}
|
|
|
|
glfwTerminate();
|
|
}
|