glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(),\r
indices.data(), GL_STATIC_DRAW);\r
\r
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
glEnableVertexAttribArray(0);\r
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(0));\r
glEnableVertexAttribArray(1);\r
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));\r
\r
glBindVertexArray(0);\r
}\r
\r
struct freecam {\r
glm::vec3 pos = glm::vec3(0, 0, -1);\r
- glm::vec2 rot;\r
+ glm::vec2 rot = glm::vec2(0, 0);\r
\r
void update(sf::Window &window) {\r
int mouseDeltaX = sf::Mouse::getPosition(window).x - window.getSize().x / 2;\r
}\r
\r
private:\r
- glm::vec3 forward;\r
+ glm::vec3 forward = glm::vec3(0, 0, 1);\r
glm::vec3 up = glm::vec3(0, 1, 0);\r
\r
const float angleFactor = 200;\r
\r
\r
struct arccam {\r
- glm::vec2 rot;\r
+ glm::vec2 rot = glm::vec2(0, 0);\r
float radius = 1;\r
\r
void update(sf::Window &window) {\r
rot.y = glm::radians(minY) * angleFactor;\r
}\r
\r
+ glm::vec3 getPos() {\r
+ float angle = rot.y / angleFactor;\r
+ \r
+ float camY = sin(angle) * exp(radius);\r
+ float camZ = cos(angle) * exp(radius);\r
+\r
+ glm::vec3 result(0.0, camY, camZ);\r
+ return glm::rotate(result, -rot.x / angleFactor, glm::vec3(0, 1, 0));\r
+ }\r
+\r
glm::mat4 getViewMatrix() {\r
float angle = rot.y / angleFactor;\r
\r
\r
std::string readFile(std::string filename) {\r
std::ifstream ifs(filename, std::ios::binary);\r
- ifs.seekg(0, ifs.end);\r
- long length = ifs.tellg();\r
- ifs.seekg(0, ifs.beg);\r
- char *buffer = (char*)malloc(length);\r
- ifs.read(buffer, length);\r
- ifs.close();\r
- std::string result(buffer);\r
- free(buffer);\r
+ std::string result, line;\r
+ while (std::getline(ifs, line))\r
+ result += line + "\n";\r
+\r
return result;\r
}\r
\r
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &success);\r
if (!success) {\r
glGetShaderInfoLog(vertShader, 512, NULL, infoLog);\r
- printf("Error compiling vertex shader: %s\n", infoLog);\r
+ printf("Error compiling vertex shader(%s): %s\n", vertFilename, infoLog);\r
}\r
\r
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);\r
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &success);\r
if (!success) {\r
glGetShaderInfoLog(fragShader, 512, NULL, infoLog);\r
- printf("Error compiling fragment shader: %s\n", infoLog);\r
+ printf("Error compiling fragment shader(%s): %s\n", fragFilename, infoLog);\r
}\r
\r
// Link Shader Program\r
int main() {\r
// Window Setup\r
\r
+ const int width = 1600, height = 900;\r
+\r
sf::ContextSettings settings;\r
settings.depthBits = 24;\r
settings.antialiasingLevel = 0;\r
\r
glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)window.getSize().x / window.getSize().y, 0.001f, 1000.0f);\r
\r
+ // Framebuffer\r
+ GLuint fbo;\r
+ glGenFramebuffers(1, &fbo);\r
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);\r
+ \r
+ GLuint renderTexture;\r
+ glGenTextures(1, &renderTexture);\r
+ glBindTexture(GL_TEXTURE_2D, renderTexture);\r
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\r
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\r
+ //glBindTexture(GL_TEXTURE_2D, 0);\r
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0);\r
+\r
+ GLuint rbo;\r
+ glGenRenderbuffers(1, &rbo);\r
+ glBindRenderbuffer(GL_RENDERBUFFER, rbo);\r
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);\r
+ //glBindRenderbuffer(GL_RENDERBUFFER, 0);\r
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);\r
+\r
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) {\r
+ printf("Successfully created framebuffer\n");\r
+ }\r
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+ \r
+ GLuint screenShaderProgram = compileShaders("shaders/fbo_vert.glsl", "shaders/fbo_frag.glsl");\r
+ glUseProgram(screenShaderProgram);\r
+ glUniform1i(glGetUniformLocation(screenShaderProgram, "screenTexture"), 0);\r
+\r
+ // Screen VAO\r
+ \r
+ GLuint screenVBO;\r
+ glGenBuffers(1, &screenVBO);\r
+\r
+ GLuint screenVAO;\r
+ glGenVertexArrays(1, &screenVAO);\r
+\r
+ glBindVertexArray(screenVAO);\r
+\r
+ float screenVerts[] = {\r
+ -1.0f, +1.0f, +0.0f, +1.0f,\r
+ -1.0f, -1.0f, +0.0f, +0.0f,\r
+ +1.0f, -1.0f, +1.0f, +0.0f,\r
+ \r
+ -1.0f, +1.0f, +0.0f, +1.0f,\r
+ +1.0f, -1.0f, +1.0f, +0.0f,\r
+ +1.0f, +1.0f, +1.0f, +1.0f,\r
+ };\r
+\r
+ glBindBuffer(GL_ARRAY_BUFFER, screenVBO);\r
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4,\r
+ screenVerts, GL_STATIC_DRAW);\r
+\r
+ glEnableVertexAttribArray(0);\r
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(0));\r
+ glEnableVertexAttribArray(1);\r
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void*)(sizeof(float) * 2));\r
+\r
+ glBindVertexArray(0);\r
+\r
+ // Config\r
+\r
struct {\r
bool wireframe = false;\r
bool freecam = false;\r
+ bool sssss = false;\r
+ int N = 2;\r
} options;\r
\r
sf::Clock deltaClock;\r
case keys::Escape:\r
running = false;\r
break;\r
- case keys::F:\r
- options.freecam = !options.freecam;\r
- break;\r
- case keys::R:\r
- if (options.freecam) {\r
- freeCam.pos = glm::vec3(0, 0, -1);\r
- freeCam.rot = glm::vec2(0);\r
- }\r
- else {\r
- arcCam.rot = glm::vec2(0);\r
- arcCam.radius = 1;\r
- }\r
- break;\r
}\r
} else if (event.type == sf::Event::EventType::MouseWheelScrolled) {\r
if (! options.freecam) {\r
\r
prevMouse = sf::Mouse::isButtonPressed(sf::Mouse::Right);\r
\r
- // Render\r
+ // Render to fbo\r
\r
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);\r
+ glClearColor(0.1f, 0.1f, 0.1f, 1.0f);\r
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
-\r
glEnable(GL_DEPTH_TEST);\r
\r
if (options.wireframe)\r
glUniform3fv(\r
glGetUniformLocation(shaderProgram, "lightPos"),\r
1, glm::value_ptr(lightPos));\r
+ glUniform3fv(\r
+ glGetUniformLocation(shaderProgram, "viewPos"),\r
+ 1, glm::value_ptr(options.freecam ? freeCam.pos : arcCam.getPos()));\r
\r
m.draw();\r
+\r
+ // Render fbo to screen\r
\r
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
\r
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+ glDisable(GL_DEPTH_TEST);\r
+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);\r
+ glClear(GL_COLOR_BUFFER_BIT);\r
+ glUseProgram(screenShaderProgram);\r
+\r
+ glUniform1i(glGetUniformLocation(screenShaderProgram, "applySSSSS"), options.sssss);\r
+ glUniform1i(glGetUniformLocation(screenShaderProgram, "N"), options.N);\r
+\r
+ glBindVertexArray(screenVAO);\r
+ glBindTexture(GL_TEXTURE_2D, renderTexture);\r
+ glDrawArrays(GL_TRIANGLES, 0, 6);\r
+ glBindVertexArray(0);\r
+\r
ImGui::SFML::Update(window, deltaClock.restart());\r
\r
ImGui::Begin("Options");\r
ImGui::Checkbox("Wireframe", &options.wireframe);\r
- ImGui::Checkbox("Free Cam (F)", &options.freecam);\r
+ ImGui::Checkbox("Free Cam", &options.freecam);\r
+ ImGui::Checkbox("SSSSS", &options.sssss);\r
+ if (options.sssss) {\r
+ ImGui::DragInt("N", &options.N, 0.05f, 1, 16);\r
+ }\r
if (options.freecam) {\r
ImGui::LabelText("Position", "%f %f %f", freeCam.pos.x, freeCam.pos.y, freeCam.pos.z);\r
ImGui::LabelText("Rotation", "%f %f", freeCam.rot.x, freeCam.rot.y);\r
+ if (ImGui::Button("Reset")) {\r
+ freeCam.pos = glm::vec3(0, 0, -1);\r
+ freeCam.rot = glm::vec2(0);\r
+ }\r
} else {\r
ImGui::LabelText("Rotation", "%f %f", arcCam.rot.x, arcCam.rot.y);\r
- ImGui::InputFloat("Radius", &arcCam.radius);\r
+ ImGui::DragFloat("Radius", &arcCam.radius, 0.01f, -1.0f, 1.0f);\r
+ if (ImGui::Button("Reset")) {\r
+ arcCam.rot = glm::vec2(0);\r
+ arcCam.radius = 1;\r
+ }\r
}\r
ImGui::End();\r
\r
window.display();\r
}\r
\r
+ glDeleteFramebuffers(1, &fbo);\r
+\r
return 0;\r
}
\ No newline at end of file