Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,9 @@
*.exe
*.out
*.app

# Custom
bindings/*
build/*
.idea/*
cmake-build-debug/*
65 changes: 65 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
cmake_minimum_required(VERSION 3.0)
project(OpenGL-Fractal CXX)

set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})
set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})

# CONFIG option is important so that CMake doesnt search for modules into the default modules directory
find_package(imgui CONFIG)
find_package(glfw CONFIG)
find_package(glew CONFIG)
find_package(fmt CONFIG)
find_package(glm CONFIG)

add_executable(
OpenGL-Fractal

src/main.cpp
src/opengl_shader.cpp

bindings/imgui_impl_glfw.cpp
bindings/imgui_impl_opengl3.cpp

lib/stb_image.cpp

assets/simple-shader.vs
assets/simple-shader.fs
)

add_custom_command(
TARGET OpenGL-Fractal
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/assets/simple-shader.vs ${PROJECT_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/assets/simple-shader.fs ${PROJECT_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/resources ${PROJECT_BINARY_DIR}/resources
)

target_compile_definitions(
OpenGL-Fractal
PUBLIC
IMGUI_IMPL_OPENGL_LOADER_GLEW
)

target_link_libraries(
OpenGL-Fractal
imgui::imgui
GLEW::glew_s
glfw::glfw
fmt::fmt
glm::glm
)

install(
FILES
${PROJECT_SOURCE_DIR}/assets/simple-shader.vs
${PROJECT_SOURCE_DIR}/assets/simple-shader.fs

DESTINATION ${PROJECT_BINARY_DIR}
)

install(
DIRECTORY
${PROJECT_SOURCE_DIR}/resources

DESTINATION ${PROJECT_BINARY_DIR}
)
23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,22 @@
# ComputerGraphics-OpenGL
# Фрактал
### Условие
Задача состоит в отрисовке фрактала (Мандельброт, Жюлия, любого другого на ваш выбор) с вычислением цвета на фрагментном шейдере.

Требования к приложению:
- поддержать возможность зума и навигации (mouse scroll, mouse drag), точка под курсором не должна съезжать (так сделана навигация в картографических приложениях, например, google maps, yandex maps, ...)
- возможность задавать на слайдерах количество итераций, пороговые значения, ...
- цветную отрисовку необходимо реализовать через передачу 1d текстуры на фрагментный шейдер

## Запуск
Собираем проект:
1) Windows `build.bat`
2) Linux `build.sh`

Далее запускаем `build/OpenGL-Fractal`

## Примеры
![](screenshots/Example-1.gif)
![](screenshots/Example-2.gif)
![](screenshots/Example-3.gif)
![](screenshots/Fractal.png)
![](screenshots/Fractal-2.png)
51 changes: 51 additions & 0 deletions assets/simple-shader.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#version 330 core

out vec4 o_frag_color;

struct vx_output_t
{
vec3 color;
vec3 pos;
};
in vx_output_t v_out;


// Variables
uniform int u_max_iterations;
uniform float u_radius;
uniform float u_zoom;
uniform vec2 u_offset;
uniform vec2 u_resolution;
uniform vec2 u_shift_zoom;
uniform vec2 u_complex;
uniform sampler1D u_texture1D;
// ^^^ Variables


int mandelbrot(vec2 point);
vec2 complex_number_product(vec2 point);

int mandelbrot(vec2 point) {
int iterations = 0;
while (length(point) < u_radius && iterations < u_max_iterations) {
point = complex_number_product(point) + u_complex;
++iterations;
}

return iterations;
}

vec2 complex_number_product(vec2 point) {
return vec2(
point.x * point.x - point.y * point.y,
point.x * point.y + point.y * point.x
);
}

void main() {
vec2 point = u_zoom * v_out.pos.xy + u_offset;
int iterations = mandelbrot(point);

float coord = float(iterations) / float(u_max_iterations);
o_frag_color = texture(u_texture1D, coord);
}
17 changes: 17 additions & 0 deletions assets/simple-shader.vs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#version 330 core

layout (location = 0) in vec3 in_position;
layout (location = 1) in vec3 in_color;

struct vx_output_t {
vec3 color;
vec3 pos;
};
out vx_output_t v_out;

void main() {
v_out.color = in_color;
v_out.pos = in_position;

gl_Position = vec4(in_position.x, in_position.y, in_position.z, 1.0);
}
9 changes: 9 additions & 0 deletions build.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@ECHO ON

RMDIR /Q /S build
MKDIR build
PUSHD build

conan install ..
cmake .. -G "Visual Studio 15 2017 Win64"
cmake --build . --config Release --target install
13 changes: 13 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/bin/bash

set -e
set -x

rm -rf build
mkdir build
pushd build

export CONAN_SYSREQUIRES_MODE=enabled
conan install ..
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --target install
19 changes: 19 additions & 0 deletions conanfile.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[requires]
imgui/1.74
glfw/3.3.2
glew/2.1.0
fmt/7.0.3
glm/0.9.9.8

[generators]
cmake_find_package_multi

[options]
glew:shared=False
fmt:header_only=True

[imports]
./res/bindings, imgui_impl_glfw.cpp -> ../bindings
./res/bindings, imgui_impl_opengl3.cpp -> ../bindings
./res/bindings, imgui_impl_glfw.h -> ../bindings
./res/bindings, imgui_impl_opengl3.h -> ../bindings
2 changes: 2 additions & 0 deletions lib/stb_image.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
Loading