From 22a5a4ee747f34efc9755ffdea1558132c3e52b8 Mon Sep 17 00:00:00 2001 From: beehelit13 Date: Mon, 2 Dec 2024 16:50:35 +0300 Subject: [PATCH] do hw5 --- .../textures/photo_2024-12-02_16-41-15.jpg | Bin 0 -> 54839 bytes tasks/local_shadertoy2/App.cpp | 256 +++++++++++++++ tasks/local_shadertoy2/App.hpp | 44 +++ tasks/local_shadertoy2/CMakeLists.txt | 17 + tasks/local_shadertoy2/main.cpp | 17 + tasks/local_shadertoy2/shaders/texture.frag | 35 ++ tasks/local_shadertoy2/shaders/toy.frag | 299 ++++++++++++++++++ tasks/local_shadertoy2/shaders/toy.vert | 14 + 8 files changed, 682 insertions(+) create mode 100644 resources/textures/photo_2024-12-02_16-41-15.jpg create mode 100644 tasks/local_shadertoy2/App.cpp create mode 100644 tasks/local_shadertoy2/App.hpp create mode 100644 tasks/local_shadertoy2/main.cpp create mode 100644 tasks/local_shadertoy2/shaders/texture.frag create mode 100644 tasks/local_shadertoy2/shaders/toy.frag create mode 100644 tasks/local_shadertoy2/shaders/toy.vert diff --git a/resources/textures/photo_2024-12-02_16-41-15.jpg b/resources/textures/photo_2024-12-02_16-41-15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47a80e1b02590104f9914881f087591a52e9eea6 GIT binary patch literal 54839 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%0A55!`_n;D_^u@G; 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�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 literal 0 HcmV?d00001 diff --git a/tasks/local_shadertoy2/App.cpp b/tasks/local_shadertoy2/App.cpp new file mode 100644 index 00000000..9693ce85 --- /dev/null +++ b/tasks/local_shadertoy2/App.cpp @@ -0,0 +1,256 @@ +#include "App.hpp" + +#include +#include +#include +#include +#define STB_IMAGE_IMPLEMENTATION +#include +#include +#include +#include + + +App::App() + : resolution{1280, 720} + , skinTextureResolution{128, 128} + , useVsync{true} +{ + { + auto glfwInstExts = windowing.getRequiredVulkanInstanceExtensions(); + + std::vector instanceExtensions{glfwInstExts.begin(), glfwInstExts.end()}; + + std::vector deviceExtensions{VK_KHR_SWAPCHAIN_EXTENSION_NAME}; + + etna::initialize(etna::InitParams{ + .applicationName = "Local Shadertoy", + .applicationVersion = VK_MAKE_VERSION(0, 1, 0), + .instanceExtensions = instanceExtensions, + .deviceExtensions = deviceExtensions, + .physicalDeviceIndexOverride = {}, + .numFramesInFlight = 1, + }); + } + + osWindow = windowing.createWindow(OsWindow::CreateInfo{ + .resolution = resolution, + }); + + { + auto surface = osWindow->createVkSurface(etna::get_context().getInstance()); + + vkWindow = etna::get_context().createWindow(etna::Window::CreateInfo{ + .surface = std::move(surface), + }); + + auto [w, h] = vkWindow->recreateSwapchain(etna::Window::DesiredProperties{ + .resolution = {resolution.x, resolution.y}, + .vsync = useVsync, + }); + + resolution = {w, h}; + } + + commandManager = etna::get_context().createPerFrameCmdMgr(); + oneShotManager = etna::get_context().createOneShotCmdMgr(); + + { + etna::create_program("shadertoy2", {LOCAL_SHADERTOY2_SHADERS_ROOT "toy.vert.spv", + LOCAL_SHADERTOY2_SHADERS_ROOT "toy.frag.spv" }); + etna::create_program("skinTexture", {LOCAL_SHADERTOY2_SHADERS_ROOT "toy.vert.spv", + LOCAL_SHADERTOY2_SHADERS_ROOT "texture.frag.spv" }); + + + fragVertPipeline = etna::get_context().getPipelineManager().createGraphicsPipeline("shadertoy2", + etna::GraphicsPipeline::CreateInfo { + .fragmentShaderOutput = { + .colorAttachmentFormats = {vk::Format::eB8G8R8A8Srgb} + } + }); + + skinTexturePipeline = etna::get_context().getPipelineManager().createGraphicsPipeline("skinTexture", + etna::GraphicsPipeline::CreateInfo { + .fragmentShaderOutput = { + .colorAttachmentFormats = {vk::Format::eB8G8R8A8Srgb} + } + }); + + skinTextureImage = etna::get_context().createImage(etna::Image::CreateInfo{ + .extent = vk::Extent3D{skinTextureResolution.x, skinTextureResolution.y, 1}, + .name = "skinTexture", + .format = vk::Format::eB8G8R8A8Srgb, + .imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled, + }); + + defaultSampler = etna::Sampler(etna::Sampler::CreateInfo + { + .filter = vk::Filter::eLinear, + .addressMode = vk::SamplerAddressMode::eRepeat, + .name = "default_sampler" + }); + } +} + +App::~App() +{ + ETNA_CHECK_VK_RESULT(etna::get_context().getDevice().waitIdle()); +} + +void App::run() +{ + while (!osWindow->isBeingClosed()) + { + windowing.poll(); + + drawFrame(); + } + + ETNA_CHECK_VK_RESULT(etna::get_context().getDevice().waitIdle()); +} + +void App::drawFrame() +{ + auto currentCmdBuf = commandManager->acquireNext(); + + if (!initializedFileTexture) { + int x, y, n; + unsigned char *picData = stbi_load(TEXTURES_ROOT "photo_2024-12-02_16-41-15.jpg", &x, &y, &n, 4); + if (picData == NULL) { + std::cerr << "photo_2024-12-02_16-41-15.jpg not found" << std::endl; + std::terminate(); + } + + etna::Image::CreateInfo fileTextureInfo{ + .extent = vk::Extent3D{static_cast(x), static_cast(y), 1}, + .name = "fileTexture", + .format = vk::Format::eR8G8B8A8Srgb, + .imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled, + }; + fileTextureImage = etna::create_image_from_bytes(fileTextureInfo, currentCmdBuf, picData); + + stbi_image_free(picData); + initializedFileTexture = true; + } + + etna::begin_frame(); + + auto nextSwapchainImage = vkWindow->acquireNext(); + + if (nextSwapchainImage) + { + auto [backbuffer, backbufferView, backbufferAvailableSem] = *nextSwapchainImage; + + ETNA_CHECK_VK_RESULT(currentCmdBuf.begin(vk::CommandBufferBeginInfo{})); + { + etna::set_state( + currentCmdBuf, + skinTextureImage.get(), + vk::PipelineStageFlagBits2::eColorAttachmentOutput, + vk::AccessFlagBits2::eColorAttachmentWrite, + vk::ImageLayout::eColorAttachmentOptimal, + vk::ImageAspectFlagBits::eColor); + + etna::flush_barriers(currentCmdBuf); + + { + etna::RenderTargetState state{currentCmdBuf, {{}, {skinTextureResolution.x, skinTextureResolution.y}}, + {{skinTextureImage.get(), skinTextureImage.getView({})}}, {}}; + auto skinInfo = etna::get_shader_program("skinTexture"); + + currentCmdBuf.bindPipeline(vk::PipelineBindPoint::eGraphics, skinTexturePipeline.getVkPipeline()); + + glm::uvec2 res = skinTextureResolution; + currentCmdBuf.pushConstants( + skinTexturePipeline.getVkPipelineLayout(), vk::ShaderStageFlagBits::eFragment, + 0, sizeof(res), &res); + + currentCmdBuf.draw(3, 1, 0, 0); + } + + + etna::set_state( + currentCmdBuf, + skinTextureImage.get(), + vk::PipelineStageFlagBits2::eFragmentShader, + vk::AccessFlagBits2::eColorAttachmentRead, + vk::ImageLayout::eShaderReadOnlyOptimal, + vk::ImageAspectFlagBits::eColor); + + etna::set_state( + currentCmdBuf, + fileTextureImage.get(), + vk::PipelineStageFlagBits2::eFragmentShader, + vk::AccessFlagBits2::eColorAttachmentRead, + vk::ImageLayout::eShaderReadOnlyOptimal, + vk::ImageAspectFlagBits::eColor); + + etna::set_state( + currentCmdBuf, + backbuffer, + vk::PipelineStageFlagBits2::eColorAttachmentOutput, + vk::AccessFlagBits2::eColorAttachmentWrite, + vk::ImageLayout::eColorAttachmentOptimal, + vk::ImageAspectFlagBits::eColor); + + etna::flush_barriers(currentCmdBuf); + + { + etna::RenderTargetState state{currentCmdBuf, {{}, {resolution.x, resolution.y}}, + {{backbuffer, backbufferView}}, {}}; + + auto fragVertInfo = etna::get_shader_program("shadertoy2"); + auto set = etna::create_descriptor_set( + fragVertInfo.getDescriptorLayoutId(0), + currentCmdBuf, + { + etna::Binding{0, skinTextureImage.genBinding(defaultSampler.get(), vk::ImageLayout::eShaderReadOnlyOptimal)}, + etna::Binding{1, fileTextureImage.genBinding(defaultSampler.get(), vk::ImageLayout::eShaderReadOnlyOptimal)} + }); + + vk::DescriptorSet vkSet = set.getVkSet(); + + currentCmdBuf.bindPipeline(vk::PipelineBindPoint::eGraphics, fragVertPipeline.getVkPipeline()); + currentCmdBuf.bindDescriptorSets( + vk::PipelineBindPoint::eGraphics, fragVertPipeline.getVkPipelineLayout(), 0, 1, &vkSet, 0, nullptr); + + glm::uvec2 res = resolution; + + currentCmdBuf.pushConstants( + fragVertPipeline.getVkPipelineLayout(), vk::ShaderStageFlagBits::eFragment, + 0, sizeof(res), &res); + + currentCmdBuf.draw(3, 1, 0, 0); + } + + etna::set_state( + currentCmdBuf, + backbuffer, + vk::PipelineStageFlagBits2::eColorAttachmentOutput, + {}, + vk::ImageLayout::ePresentSrcKHR, + vk::ImageAspectFlagBits::eColor); + etna::flush_barriers(currentCmdBuf); + } + ETNA_CHECK_VK_RESULT(currentCmdBuf.end()); + + auto renderingDone = + commandManager->submit(std::move(currentCmdBuf), std::move(backbufferAvailableSem)); + + const bool presented = vkWindow->present(std::move(renderingDone), backbufferView); + + if (!presented) + nextSwapchainImage = std::nullopt; + } + + etna::end_frame(); + + if (!nextSwapchainImage && osWindow->getResolution() != glm::uvec2{0, 0}) + { + auto [w, h] = vkWindow->recreateSwapchain(etna::Window::DesiredProperties{ + .resolution = {resolution.x, resolution.y}, + .vsync = useVsync, + }); + ETNA_VERIFY((resolution == glm::uvec2{w, h})); + } +} \ No newline at end of file diff --git a/tasks/local_shadertoy2/App.hpp b/tasks/local_shadertoy2/App.hpp new file mode 100644 index 00000000..63949f77 --- /dev/null +++ b/tasks/local_shadertoy2/App.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "wsi/OsWindowingManager.hpp" + + +class App +{ +public: + App(); + ~App(); + + void run(); + +private: + void drawFrame(); + +private: + OsWindowingManager windowing; + std::unique_ptr osWindow; + + glm::uvec2 resolution; + glm::uvec2 skinTextureResolution; + bool useVsync; + + etna::GraphicsPipeline skinTexturePipeline; + etna::GraphicsPipeline fragVertPipeline; + etna::Image skinTextureImage; + etna::Image fileTextureImage; + etna::Sampler defaultSampler; + + std::unique_ptr vkWindow; + std::unique_ptr commandManager; + std::unique_ptr oneShotManager; + + bool initializedFileTexture = false; +}; \ No newline at end of file diff --git a/tasks/local_shadertoy2/CMakeLists.txt b/tasks/local_shadertoy2/CMakeLists.txt index e69de29b..e8c5be36 100644 --- a/tasks/local_shadertoy2/CMakeLists.txt +++ b/tasks/local_shadertoy2/CMakeLists.txt @@ -0,0 +1,17 @@ +add_executable(local_shadertoy2 + main.cpp + App.cpp +) + +target_link_libraries(local_shadertoy2 + PRIVATE glfw etna glm::glm wsi gui) + +target_add_shaders(local_shadertoy2 + shaders/toy.vert + shaders/toy.frag + shaders/texture.frag +) + +target_link_libraries(local_shadertoy2 PUBLIC render_utils scene) + +add_compile_definitions(local_shadertoy2 PRIVATE TEXTURES_ROOT="${PROJECT_SOURCE_DIR}/resources/textures/") \ No newline at end of file diff --git a/tasks/local_shadertoy2/main.cpp b/tasks/local_shadertoy2/main.cpp new file mode 100644 index 00000000..b939bed3 --- /dev/null +++ b/tasks/local_shadertoy2/main.cpp @@ -0,0 +1,17 @@ +#include "App.hpp" + +#include + + +int main() +{ + { + App app; + app.run(); + } + + if (etna::is_initilized()) + etna::shutdown(); + + return 0; +} \ No newline at end of file diff --git a/tasks/local_shadertoy2/shaders/texture.frag b/tasks/local_shadertoy2/shaders/texture.frag new file mode 100644 index 00000000..7819e64b --- /dev/null +++ b/tasks/local_shadertoy2/shaders/texture.frag @@ -0,0 +1,35 @@ +#version 430 +#extension GL_GOOGLE_include_directive : require + + +layout(location = 0) out vec4 out_fragColor; + +layout(push_constant) uniform params_t +{ + uvec2 resolution; +} params; + +const float iTime = 1.0; + + +// https://www.shadertoy.com/view/MsXSzM + +#define TIMESCALE 0.25 +#define TILES 8 +#define COLOR 0.7, 1.6, 2.8 + +void main() +{ + vec2 uv = gl_FragCoord.xy / vec2(128, 128); + uv.x *= 128 / 128; + + vec4 noise = vec4(72897, 1273498, 7129347, 61251); + float p = 1.0 - mod(noise.r + noise.g + noise.b + iTime * float(TIMESCALE), 1.0); + p = min(max(p * 3.0 - 1.8, 0.1), 2.0); + + vec2 r = mod(uv * float(TILES), 1.0); + r = vec2(pow(r.x - 0.5, 2.0), pow(r.y - 0.5, 2.0)); + p *= 1.0 - pow(min(1.0, 12.0 * dot(r, r)), 2.0); + + out_fragColor = vec4(COLOR, 1.0) * p; +} diff --git a/tasks/local_shadertoy2/shaders/toy.frag b/tasks/local_shadertoy2/shaders/toy.frag new file mode 100644 index 00000000..0a41cbac --- /dev/null +++ b/tasks/local_shadertoy2/shaders/toy.frag @@ -0,0 +1,299 @@ +#version 430 +#extension GL_GOOGLE_include_directive : require + + +layout(binding = 0) uniform sampler2D iChannel0; +layout(binding = 1) uniform sampler2D iChannel1; + +layout(location = 0) out vec4 out_fragColor; + +layout(push_constant) uniform params_t +{ + uvec2 resolution; +} params; + + +const float iTime = 10.0f; + +const float PI = 3.14159265359; + +const vec2 iResolution = vec2(1280, 720); +const ivec3 iMouse = ivec3(0, 1, 0); + +const vec3 eye = vec3 ( 4, 0, 2 ); +const vec3 light = vec3 ( 15.0, -1.0, 0.0 ); +const int maxSteps = 70; +const float eps = 0.01; + +// Rotation matrix around the X axis. +mat3 rotateX(float theta) { + float c = cos(theta); + float s = sin(theta); + return mat3( + vec3(1, 0, 0), + vec3(0, c, -s), + vec3(0, s, c) + ); +} + +// Rotation matrix around the Y axis. +mat3 rotateY(float theta) { + float c = cos(theta); + float s = sin(theta); + return mat3( + vec3(c, 0, s), + vec3(0, 1, 0), + vec3(-s, 0, c) + ); +} + +float dSphere ( vec3 p, in vec3 c ) +{ + return length ( p - c ) - 1.0 + 0.03 * sin(20.0*p.x + iTime); +} + +float length8 ( in vec2 p ) +{ + return pow ( pow ( p.x, 8.0 ) + pow ( p.y, 8.0 ), 1.0/ 8.0 ); +} + +float length8 ( in vec3 p ) +{ + return pow ( pow ( p.x, 8.0 ) + pow ( p.y, 8.0 ) + pow ( p.z, 8.0 ), 1.0/ 8.0 ); +} + + +float dTorus ( vec3 p, vec2 t ) +{ + vec2 q = vec2 ( length8 ( p.xz ) - t.x, p.y ); + + return length8 ( q ) - t.y; +} + +float smin ( float a, float b, float k ) +{ + float res = exp ( -k*a ) + exp ( -k*b ); + return -log ( res ) / k; +} + +float sdf ( in vec3 p ) +{ + //return dSphere ( p, vec3 ( 0, 0, 0 ) ); + //return dBox ( p, vec3 ( 0.5, 0.2, 0.7 ) ); + return dTorus ( p, vec2 ( 0.73, 0.5 ) ); +} + +float sdPyramid( vec3 p, float h ) +{ + float m2 = h*h + 0.25; + + p.xz = abs(p.xz); + p.xz = (p.z>p.x) ? p.zx : p.xz; + p.xz -= 0.5; + + vec3 q = vec3( p.z, h*p.y - 0.5*p.x, h*p.x + 0.5*p.y); + + float s = max(-q.x,0.0); + float t = clamp( (q.y-0.5*p.z)/(m2+0.25), 0.0, 1.0 ); + + float a = m2*(q.x+s)*(q.x+s) + q.y*q.y; + float b = m2*(q.x+0.5*t)*(q.x+0.5*t) + (q.y-m2*t)*(q.y-m2*t); + + float d2 = min(q.y,-q.x*m2-q.y*0.5) > 0.0 ? 0.0 : min(a,b); + + return sqrt( (d2+q.z*q.z)/m2 ) * sign(max(q.z,-p.y)); +} + +float sdf ( in vec3 p, in mat3 m ) +{ + vec3 q = m * p; + + //return dSphere ( p, vec3 ( 2, 0, 0 ) ); + //return dBox ( q, vec3 ( 0.5, 0.2, 0.7 ) ); + return sdPyramid(q, 0.9); +} + +vec3 trace ( in vec3 from, in vec3 dir, out bool hit, in mat3 m ) +{ + vec3 p = from; + float totalDist = 0.0; + + hit = false; + + for ( int steps = 0; steps < maxSteps; steps++ ) + { + float dist = sdf ( p, m ); + + if ( dist < 0.01 ) + { + hit = true; + break; + } + + totalDist += dist; + + if ( totalDist > 20.0 ) + break; + + p += dist * dir; + } + + return p; +} + +vec3 generateNormal ( vec3 z, float d, in mat3 m ) +{ + float e = max (d * 0.5, eps ); + float dx1 = sdf(z + vec3(e, 0, 0), m); + float dx2 = sdf(z - vec3(e, 0, 0), m); + float dy1 = sdf(z + vec3(0, e, 0), m); + float dy2 = sdf(z - vec3(0, e, 0), m); + float dz1 = sdf(z + vec3(0, 0, e), m); + float dz2 = sdf(z - vec3(0, 0, e), m); + + return normalize ( vec3 ( dx1 - dx2, dy1 - dy2, dz1 - dz2 ) ); +} + +const float roughness = 0.2; +const vec3 r0 = vec3 ( 1.0, 0.92, 0.23 ); +const vec3 clr = vec3 ( 0.7, 0.7, 0.5 ); +const float gamma = 10.0; +const float pi = 3.1415926; +const float FDiel = 0.04; // Fresnel for dielectrics + +vec3 fresnel ( in vec3 f0, in float product ) +{ + product = clamp ( product, 0.0, 1.0 ); // saturate + + return mix ( f0, vec3 (1.0), pow(1.0 - product, 5.0) ); +} + +float D_blinn(in float roughness, in float NdH) +{ + float m = roughness * roughness; + float m2 = m * m; + float n = 2.0 / m2 - 2.0; + return (n + 2.0) / (2.0 * pi) * pow(NdH, n); +} + +float D_beckmann ( in float roughness, in float NdH ) +{ + float m = roughness * roughness; + float m2 = m * m; + float NdH2 = NdH * NdH; + + return exp( (NdH2 - 1.0) / (m2 * NdH2) ) / (pi * m2 * NdH2 * NdH2); +} + +float D_GGX ( in float roughness, in float NdH ) +{ + float m = roughness * roughness; + float m2 = m * m; + float NdH2 = NdH * NdH; + float d = (m2 - 1.0) * NdH2 + 1.0; + + return m2 / (pi * d * d); +} + +float G_schlick ( in float roughness, in float nv, in float nl ) +{ + float k = roughness * roughness * 0.5; + float V = nv * (1.0 - k) + k; + float L = nl * (1.0 - k) + k; + + return 0.25 / (V * L); +} + +float G_neumann ( in float nl, in float nv ) +{ + return nl * nv / max ( nl, nv ); +} + +float G_klemen ( in float nl, in float nv, in float vh ) +{ + return nl * nv / (vh * vh ); +} + +float G_default ( in float nl, in float nh, in float nv, in float vh ) +{ + return min ( 1.0, min ( 2.0*nh*nv/vh, 2.0*nh*nl/vh ) ); +} + +vec4 cookTorrance ( in vec3 p, in vec3 n, in vec3 l, in vec3 v, vec3 base) +{ + vec3 h = normalize ( l + v ); + float nh = dot (n, h); + float nv = dot (n, v); + float nl = dot (n, l); + float vh = dot (v, h); + float metallness = 1.0; +// vec3 base = pow ( clr, vec3 ( gamma ) ); + vec3 F0 = mix ( vec3(FDiel), clr, metallness ); + + // compute Beckman + float d = D_beckmann ( roughness, nh ); + + // compute Fresnel + vec3 f = fresnel ( F0, nv ); + + // default G + float g = G_default ( nl, nh, nv, vh ); + + // resulting color + vec3 ct = f*(0.25 * d * g / nv); + vec3 diff = max(nl, 0.0) * ( vec3 ( 1.0 ) - f ) / pi; + float ks = 0.5; + + return vec4 ( pow ( diff * base + ks * ct, vec3 ( 1.0 / gamma ) ), 1.0 ); +} + +vec4 boxmap( in sampler2D s, in vec3 p, in vec3 n, in float k ) +{ + // project+fetch + vec4 x = texture( s, p.yz ); + vec4 y = texture( s, p.zx ); + vec4 z = texture( s, p.xy ); + + // blend weights + vec3 w = pow( abs(n), vec3(k) ); + // blend and return + return (x*w.x + y*w.y + z*w.z) / (w.x + w.y + w.z); +} + +void main() +{ + + vec4 fragColor; + vec2 fragCoord = gl_FragCoord.xy; + + // Normalized pixel coordinates (from 0 to 1) + bool hit; + vec3 mouse = vec3(iMouse.xy/iResolution.xy - 0.5,iMouse.z-.5); + mat3 m = rotateX ( 6.0*mouse.y ) * rotateY ( 6.0*mouse.x); + vec2 scale = 9.0 * iResolution.xy / max ( iResolution.x, iResolution.y ) ; + vec2 uv = scale * ( fragCoord/iResolution.xy - vec2 ( 0.5 ) ); + vec3 dir = normalize ( vec3 ( uv, 0 ) - eye ); + vec4 color = vec4 ( 0, 0, 0, 1 ); + vec3 p = trace ( eye, dir, hit, m ); + + // vec3 base = pow ( clr, vec3 ( gamma ) ); + + + if ( hit ) + { + vec3 l = normalize ( light - p ); + vec3 v = normalize ( eye - p ); + vec3 n = generateNormal ( p, 0.001, m ); + float nl = max ( 0.0, dot ( n, l ) ); + vec3 h = normalize ( l + v ); + float hn = max ( 0.0, dot ( h, n ) ); + float sp = pow ( hn, 150.0 ); + + color = cookTorrance ( p, n, l, v, boxmap(iChannel0, m * p, generateNormal(p, 0.5, m), 0.5).xyz); + } else { + color = texture(iChannel1, uv); + } + + // Output to screen + out_fragColor = color; +} diff --git a/tasks/local_shadertoy2/shaders/toy.vert b/tasks/local_shadertoy2/shaders/toy.vert new file mode 100644 index 00000000..7d67f07c --- /dev/null +++ b/tasks/local_shadertoy2/shaders/toy.vert @@ -0,0 +1,14 @@ +#version 430 +#extension GL_GOOGLE_include_directive : require + + +void main(void) +{ + if (gl_VertexIndex == 0) { + gl_Position = vec4(-1.0f, -1.0f, 0.0f, 1.0f); + } else if (gl_VertexIndex == 1) { + gl_Position = vec4(3.0f, -1.0f, 0.0f, 1.0f); + } else { + gl_Position = vec4(-1.0f, 3.0f, 0.0f, 1.0f); + } +} \ No newline at end of file