diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index b1cb0b4..0635e58 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -65,6 +65,8 @@ void FrameBuffer::init() use_alpha_ ? GL_RGBA8 : GL_RGB8, attrib_.viewport.x, attrib_.viewport.y, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); // attach the multisampled texture to FBO (framebufferid_ currently binded) diff --git a/ImageProcessingShader.cpp b/ImageProcessingShader.cpp index af9b3c8..56b3f62 100644 --- a/ImageProcessingShader.cpp +++ b/ImageProcessingShader.cpp @@ -9,13 +9,13 @@ const char* ImageProcessingShader::filter_names[12] = { "None", "Blur", "Sharpen "Erosion 3x3", "Erosion 5x5", "Erosion 7x7", "Dilation 3x3", "Dilation 5x5", "Dilation 7x7" }; -ImageProcessingShader::ImageProcessingShader() +ImageProcessingShader::ImageProcessingShader(): Shader() { program_ = &imageProcessingShadingProgram; reset(); } -ImageProcessingShader::ImageProcessingShader(const ImageProcessingShader &S) +ImageProcessingShader::ImageProcessingShader(const ImageProcessingShader &S): Shader() { program_ = &imageProcessingShadingProgram; reset(); @@ -38,8 +38,6 @@ void ImageProcessingShader::use() { Shader::use(); -// program_->setUniform("iChannelResolution[0]", iChannelResolution[0].x, iChannelResolution[0].y, iChannelResolution[0].z); - program_->setUniform("brightness", brightness); program_->setUniform("contrast", contrast); program_->setUniform("saturation", saturation); @@ -63,9 +61,6 @@ void ImageProcessingShader::reset() { Shader::reset(); -// // no texture resolution yet -// iChannelResolution[0] = glm::vec3(1.f); - // default values for image processing brightness = 0.f; contrast = 0.f; diff --git a/ImageProcessingShader.h b/ImageProcessingShader.h index 23d77fc..d52e48c 100644 --- a/ImageProcessingShader.h +++ b/ImageProcessingShader.h @@ -3,7 +3,7 @@ #include -#include "Shader.h" +#include "ImageShader.h" class ImageProcessingShader : public Shader @@ -19,9 +19,6 @@ public: void operator = (const ImageProcessingShader &S); -// // textures resolution -// glm::vec3 iChannelResolution[1]; - // color effects float brightness; // [-1 1] float contrast; // [-1 1] diff --git a/ImageShader.cpp b/ImageShader.cpp index 45b32c4..5f96b9d 100644 --- a/ImageShader.cpp +++ b/ImageShader.cpp @@ -10,7 +10,7 @@ static ShadingProgram imageShadingProgram("shaders/image.vs", "shaders/image.fs" const char* ImageShader::mask_names[11] = { "None", "Glow", "Halo", "Circle", "Round", "Vignette", "Top", "Botton", "Left", "Right", "Custom" }; std::vector< uint > ImageShader::mask_presets; -ImageShader::ImageShader(): Shader(), mask(0), custom_textureindex(0), stipple(0.0), uv(0.0, 0.0, 1.0, 1.0) +ImageShader::ImageShader(): Shader(), mask(0), custom_textureindex(0), stipple(0.0) { // first initialization if ( mask_presets.empty() ) { @@ -36,20 +36,16 @@ void ImageShader::use() Shader::use(); program_->setUniform("stipple", stipple); - program_->setUniform("uv", uv); glActiveTexture(GL_TEXTURE1); - if ( mask < 10 ) { + if ( mask < 10 ) glBindTexture(GL_TEXTURE_2D, mask_presets[mask]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } else glBindTexture(GL_TEXTURE_2D, custom_textureindex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glActiveTexture(GL_TEXTURE0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); } @@ -62,9 +58,6 @@ void ImageShader::reset() custom_textureindex = mask_presets[0]; // no stippling stipple = 0.f; - // normal uv - uv = glm::vec4(0.0, 0.0, 1.0, 1.0); -// uv = glm::vec4(0.0, 0.0, 2.0, 2.0); } void ImageShader::operator = (const ImageShader &S ) @@ -74,7 +67,6 @@ void ImageShader::operator = (const ImageShader &S ) mask = S.mask; custom_textureindex = S.custom_textureindex; stipple = S.stipple; - uv = S.uv; } diff --git a/ImageShader.h b/ImageShader.h index 9c4ba14..6ad0c0b 100644 --- a/ImageShader.h +++ b/ImageShader.h @@ -26,7 +26,6 @@ public: uint mask; uint custom_textureindex; float stipple; - glm::vec4 uv; static const char* mask_names[11]; static std::vector< uint > mask_presets; diff --git a/MediaPlayer.cpp b/MediaPlayer.cpp index 0de9805..f75ebb0 100644 --- a/MediaPlayer.cpp +++ b/MediaPlayer.cpp @@ -617,6 +617,8 @@ void MediaPlayer::init_texture(guint index) GL_RGBA, GL_UNSIGNED_BYTE, frame_[index].vframe.data[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); if (!media_.isimage) { diff --git a/Primitives.cpp b/Primitives.cpp index 4510d15..d9da99f 100644 --- a/Primitives.cpp +++ b/Primitives.cpp @@ -85,8 +85,16 @@ void Surface::draw(glm::mat4 modelview, glm::mat4 projection) if ( !initialized() ) init(); - if ( textureindex_ ) + glActiveTexture(GL_TEXTURE0); + if ( textureindex_ ) { glBindTexture(GL_TEXTURE_2D, textureindex_); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // TODO add user input to select mode +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } else glBindTexture(GL_TEXTURE_2D, Resource::getTextureBlack()); @@ -97,15 +105,14 @@ void Surface::draw(glm::mat4 modelview, glm::mat4 projection) void Surface::setTextureUV(glm::vec4 uv) { - dynamic_cast(shader_)->uv = uv; + shader_->uv = uv; } glm::vec4 Surface::textureUV() const { - return dynamic_cast(shader_)->uv; + return shader_->uv; } - ImageSurface::ImageSurface(const std::string& path, Shader *s) : Surface(s), resource_(path) { diff --git a/Resource.cpp b/Resource.cpp index 98645e3..bd0bda9 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -33,6 +33,10 @@ uint Resource::getTextureBlack() if (tex_index_black == 0) { glGenTextures(1, &tex_index_black); glBindTexture( GL_TEXTURE_2D, tex_index_black); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); unsigned char clearColor[4] = {0, 0, 0, 255}; // texture with one black pixel glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1); @@ -50,6 +54,10 @@ uint Resource::getTextureWhite() if (tex_index_white == 0) { glGenTextures(1, &tex_index_white); glBindTexture( GL_TEXTURE_2D, tex_index_white); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); unsigned char clearColor[4] = {255, 255, 255, 255}; // texture with one black pixel glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1); @@ -67,6 +75,10 @@ uint Resource::getTextureTransparent() if (tex_index_transparent == 0) { glGenTextures(1, &tex_index_transparent); glBindTexture( GL_TEXTURE_2D, tex_index_transparent); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); unsigned char clearColor[4] = {0, 0, 0, 0}; // texture with one black pixel glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1); @@ -265,6 +277,8 @@ uint Resource::getTextureImage(const std::string& path, float *aspect_ratio) glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // free memory stbi_image_free(img); diff --git a/SessionCreator.cpp b/SessionCreator.cpp index e210007..3eb86bd 100644 --- a/SessionCreator.cpp +++ b/SessionCreator.cpp @@ -431,9 +431,9 @@ void SessionLoader::visit(ImageShader &n) uniforms->QueryUnsignedAttribute("mask", &n.mask); } - XMLElement* uvtex = xmlCurrent_->FirstChildElement("uv"); - if (uvtex) - tinyxml2::XMLElementToGLM( uvtex->FirstChildElement("vec4"), n.uv); +// XMLElement* uvtex = xmlCurrent_->FirstChildElement("uv"); +// if (uvtex) +// tinyxml2::XMLElementToGLM( uvtex->FirstChildElement("vec4"), n.uv); } void SessionLoader::visit(ImageProcessingShader &n) diff --git a/SessionVisitor.cpp b/SessionVisitor.cpp index e4fe65d..a6bedd4 100644 --- a/SessionVisitor.cpp +++ b/SessionVisitor.cpp @@ -202,9 +202,9 @@ void SessionVisitor::visit(ImageShader &n) uniforms->SetAttribute("mask", n.mask); xmlCurrent_->InsertEndChild(uniforms); - XMLElement *uvtex = xmlDoc_->NewElement("uv"); - uvtex->InsertEndChild( XMLElementFromGLM(xmlDoc_, n.uv) ); - xmlCurrent_->InsertEndChild(uvtex); +// XMLElement *uvtex = xmlDoc_->NewElement("uv"); +// uvtex->InsertEndChild( XMLElementFromGLM(xmlDoc_, n.uv) ); +// xmlCurrent_->InsertEndChild(uvtex); } diff --git a/Shader.cpp b/Shader.cpp index cfe9f71..b0fb0ad 100644 --- a/Shader.cpp +++ b/Shader.cpp @@ -186,6 +186,7 @@ void Shader::operator = (const Shader &S ) { color = S.color; blending = S.blending; + uv = S.uv; } void Shader::accept(Visitor& v) { @@ -205,6 +206,7 @@ void Shader::use() program_->setUniform("projection", projection); program_->setUniform("modelview", modelview); program_->setUniform("color", color); + program_->setUniform("uv", uv); iResolution = glm::vec3( Rendering::manager().currentAttrib().viewport, 0.f); program_->setUniform("iResolution", iResolution); @@ -237,6 +239,7 @@ void Shader::reset() modelview = glm::identity(); iResolution = glm::vec3(1280.f, 720.f, 0.f); color = glm::vec4(1.f, 1.f, 1.f, 1.f); + uv = glm::vec4(0.0, 0.0, 1.0, 1.0); } diff --git a/Shader.h b/Shader.h index 834fc05..fedd548 100644 --- a/Shader.h +++ b/Shader.h @@ -55,6 +55,7 @@ public: glm::mat4 projection; glm::mat4 modelview; glm::vec4 color; + glm::vec4 uv; typedef enum { BLEND_OPACITY = 0, diff --git a/Source.cpp b/Source.cpp index dfded20..102a539 100644 --- a/Source.cpp +++ b/Source.cpp @@ -434,18 +434,19 @@ void Source::update(float dt) groups_[View::RENDERING]->translation_.z = groups_[View::LAYER]->translation_.z; // MODIFY texture projection based on APPEARANCE node - texturesurface_->translation_.x = groups_[View::APPEARANCE]->translation_.x; + glm::vec3 center = groups_[View::APPEARANCE]->translation_; if (renderbuffer_) - texturesurface_->translation_.x /= renderbuffer_->aspectRatio(); - texturesurface_->translation_.y = groups_[View::APPEARANCE]->translation_.y; - texturesurface_->rotation_.z = groups_[View::APPEARANCE]->rotation_.z; - // avoid any null scale - s = groups_[View::APPEARANCE]->scale_; - s.x = CLAMP_SCALE(s.x); - s.y = CLAMP_SCALE(s.y); - s.z = 1.f; - texturesurface_->scale_ = s; - texturesurface_->update(dt); + center.x /= renderbuffer_->aspectRatio(); + glm::vec3 UL = glm::vec3(-1.f, 1.f, 0.f) - center; + glm::vec3 BR = glm::vec3(1.f, -1.f, 0.f) - center; + UL /= groups_[View::APPEARANCE]->scale_; + BR /= groups_[View::APPEARANCE]->scale_; + glm::vec4 uv; + uv.x = UL.x * 0.5f + 0.5f; + uv.y = UL.y * -0.5f + 0.5f; + uv.z = BR.x * 0.5f + 0.5f; + uv.w = BR.y * -0.5f + 0.5f; + texturesurface_->setTextureUV(uv); need_update_ = false; } diff --git a/Stream.cpp b/Stream.cpp index 955c90a..fc80743 100644 --- a/Stream.cpp +++ b/Stream.cpp @@ -365,7 +365,8 @@ void Stream::init_texture(guint index) GL_RGBA, GL_UNSIGNED_BYTE, frame_[index].vframe.data[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // set pbo image size pbo_size_ = height_ * width_ * 4; diff --git a/View.cpp b/View.cpp index 01795a6..14e7ed8 100644 --- a/View.cpp +++ b/View.cpp @@ -604,6 +604,8 @@ uint MixingView::textureMixingQuadratic() glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, CIRCLE_PIXELS, CIRCLE_PIXELS, GL_BGRA, GL_UNSIGNED_BYTE, matrix); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } return texid; @@ -1836,41 +1838,6 @@ void AppearanceView::draw() View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair pick) { -// View::Cursor ret = Cursor(); -// std::ostringstream info; - -// // work on the given source -// if (!s) -// return ret; - -// Group *sourceNode = s->group(mode_); // groups_[View::APPEARANCE] - -// // grab coordinates in scene-View reference frame -// glm::vec3 scene_from = Rendering::manager().unProject(from, scene.root()->transform_); -// glm::vec3 scene_to = Rendering::manager().unProject(to, scene.root()->transform_); -// glm::vec3 scene_translation = scene_to - scene_from; - -// // make sure matrix transform of stored status is updated -// s->stored_status_->update(0); - -// ret.type = Cursor_ResizeAll; -// info << "UV " ; - -// sourceNode->translation_ = s->stored_status_->translation_ + scene_translation; - -//// ImageShader *shader = s->blendingShader (); -//// shader->uv.x += scene_translation.x; -//// shader->uv.y += scene_translation.y; -//// shader->uv.z += scene_translation.x; -//// shader->uv.w += scene_translation.y; - - -// // request update -// s->touch(); - -// // update cursor -// ret.info = info.str(); -// return ret; View::Cursor ret = Cursor(); // work on the given source diff --git a/rsc/shaders/image.fs b/rsc/shaders/image.fs index 4d123bd..61a1ffc 100644 --- a/rsc/shaders/image.fs +++ b/rsc/shaders/image.fs @@ -5,13 +5,15 @@ out vec4 FragColor; in vec4 vertexColor; in vec2 vertexUV; +// from General Shader +uniform vec3 iResolution; // viewport resolution (in pixels) +uniform vec4 color; +uniform vec4 uv; + +// Image Shader uniform sampler2D iChannel0; // input channel (texture id). uniform sampler2D iChannel1; // input mask -uniform vec3 iResolution; // viewport resolution (in pixels) - -uniform vec4 color; uniform float stipple; -uniform vec4 uv; void main() { diff --git a/rsc/shaders/imageblending.fs b/rsc/shaders/imageblending.fs new file mode 100644 index 0000000..61a1ffc --- /dev/null +++ b/rsc/shaders/imageblending.fs @@ -0,0 +1,36 @@ +#version 330 core + +out vec4 FragColor; + +in vec4 vertexColor; +in vec2 vertexUV; + +// from General Shader +uniform vec3 iResolution; // viewport resolution (in pixels) +uniform vec4 color; +uniform vec4 uv; + +// Image Shader +uniform sampler2D iChannel0; // input channel (texture id). +uniform sampler2D iChannel1; // input mask +uniform float stipple; + +void main() +{ + // adjust UV + vec2 texcoord = vec2(uv.x, uv.y) + vertexUV * vec2(uv.z - uv.x, uv.w - uv.y); + + // color is a mix of texture (manipulated with brightness & contrast), vertex and uniform colors + vec4 textureColor = texture(iChannel0, texcoord); + vec3 RGB = textureColor.rgb * vertexColor.rgb * color.rgb; + + // alpha is a mix of texture alpha, vertex alpha, and uniform alpha affected by stippling + vec4 maskColor = texture(iChannel1, vertexUV); + float maskIntensity = (maskColor.r + maskColor.g + maskColor.b) / 3.0; + + float A = textureColor.a * vertexColor.a * color.a * maskIntensity; + A -= stipple * ( int(gl_FragCoord.x + gl_FragCoord.y) % 2 > 0 ? 0.05 : 0.95 ); + + // output RGBA + FragColor = vec4(RGB, clamp(A, 0.0, 1.0) ); +} diff --git a/rsc/shaders/imageprocessing.fs b/rsc/shaders/imageprocessing.fs index 15e22d3..7e3a029 100644 --- a/rsc/shaders/imageprocessing.fs +++ b/rsc/shaders/imageprocessing.fs @@ -25,14 +25,17 @@ out vec4 FragColor; in vec4 vertexColor; in vec2 vertexUV; -// general shader uniforms -uniform vec4 color; +vec2 texcoord; // image processing specific -uniform sampler2D iChannel0; // input channel (texture id). -//uniform vec3 iChannelResolution[1]; // replaced by textureSize(iChannel0, 0); +uniform sampler2D iChannel0; // input channel (texture id). uniform vec3 iResolution; // viewport resolution (in pixels) +// Image shader uniforms +uniform vec4 color; +uniform vec4 uv; + +// Image processing uniforms uniform float contrast; uniform float brightness; uniform float saturation; @@ -74,47 +77,47 @@ vec3 erosion(int N, vec2 filter_step) { vec3 minValue = vec3(1.0); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0,0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0,-1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (1.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0,0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0,-1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (1.0, 0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0, 1.0) * filter_step ).rgb, minValue); if (N < 1) return minValue; - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0, -2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0,-2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (1.0,-2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0,2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (1.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-2.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 1.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 2.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-2.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 1.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 2.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 2.0, 0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, -2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0,-2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (1.0,-2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0,2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0, 2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (1.0, 2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 1.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, -1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 1.0, -1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, -1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, 0.0) * filter_step ).rgb, minValue); if (N < 2) return minValue; - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0, -3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0,-3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (1.0,-3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-1.0,3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (0.0, 3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (1.0, 3.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-2.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 2.0, 2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-2.0, -2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 2.0, -2.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-3.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (3.0, -1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-3.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 3.0, 1.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 (-3.0, 0.0) * filter_step ).rgb, minValue); - minValue = min(texture(iChannel0, vertexUV + vec2 ( 3.0, 0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, -3.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0,-3.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (1.0,-3.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-1.0,3.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (0.0, 3.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (1.0, 3.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, 2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, 2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, -2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, -2.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-3.0, -1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (3.0, -1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-3.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 3.0, 1.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 (-3.0, 0.0) * filter_step ).rgb, minValue); + minValue = min(texture(iChannel0, texcoord + vec2 ( 3.0, 0.0) * filter_step ).rgb, minValue); return minValue; } @@ -123,47 +126,47 @@ vec3 dilation(int N, vec2 filter_step) { vec3 maxValue = vec3(0.0); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0,-1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (1.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0,-1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (1.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 1.0) * filter_step ).rgb, maxValue); if (N < 1) return maxValue; - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0, -2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0,-2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (1.0,-2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0,2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (1.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-2.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 1.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 2.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-2.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 1.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 2.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-2.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 2.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, -2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0,-2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (1.0,-2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0,2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (1.0, 2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 1.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, -1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 1.0, -1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, -1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, 0.0) * filter_step ).rgb, maxValue); if (N < 2) return maxValue; - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0, -3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0,-3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (1.0,-3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-1.0,3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (0.0, 3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (1.0, 3.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-2.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 2.0, 2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-2.0, -2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 2.0, -2.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-3.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (3.0, -1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-3.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 3.0, 1.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 (-3.0, 0.0) * filter_step ).rgb, maxValue); - maxValue = max(texture(iChannel0, vertexUV + vec2 ( 3.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, -3.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0,-3.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (1.0,-3.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0,3.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 3.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (1.0, 3.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, 2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, 2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, -2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, -2.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-3.0, -1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (3.0, -1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-3.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 3.0, 1.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 (-3.0, 0.0) * filter_step ).rgb, maxValue); + maxValue = max(texture(iChannel0, texcoord + vec2 ( 3.0, 0.0) * filter_step ).rgb, maxValue); return maxValue; } @@ -173,29 +176,29 @@ vec3 opening(vec2 filter_step) { // 1) erosion vec3 minValue1 = vec3(1.0); - minValue1 = min(texture(iChannel0, vertexUV + vec2 (0.0, 0.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, vertexUV + vec2 (0.0, 1.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, vertexUV + vec2 (0.0, 2.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, vertexUV + vec2 (1.0, 1.0) * filter_step ).rgb, minValue1); - minValue1 = min(texture(iChannel0, vertexUV + vec2 (1.0, -1.0) * filter_step ).rgb, minValue1); + minValue1 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue1); + minValue1 = min(texture(iChannel0, texcoord + vec2 (0.0, 1.0) * filter_step ).rgb, minValue1); + minValue1 = min(texture(iChannel0, texcoord + vec2 (0.0, 2.0) * filter_step ).rgb, minValue1); + minValue1 = min(texture(iChannel0, texcoord + vec2 (1.0, 1.0) * filter_step ).rgb, minValue1); + minValue1 = min(texture(iChannel0, texcoord + vec2 (1.0, -1.0) * filter_step ).rgb, minValue1); vec3 minValue2 = vec3(1.0); - minValue2 = min(texture(iChannel0, vertexUV + vec2 (0.0, 0.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, vertexUV + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, vertexUV + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, vertexUV + vec2 (1.0, -1.0) * filter_step ).rgb, minValue2); - minValue2 = min(texture(iChannel0, vertexUV + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue2); + minValue2 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue2); + minValue2 = min(texture(iChannel0, texcoord + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue2); + minValue2 = min(texture(iChannel0, texcoord + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue2); + minValue2 = min(texture(iChannel0, texcoord + vec2 (1.0, -1.0) * filter_step ).rgb, minValue2); + minValue2 = min(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue2); vec3 minValue3 = vec3(1.0); - minValue3 = min(texture(iChannel0, vertexUV + vec2 (0.0, 0.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, vertexUV + vec2 (0.0, -1.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, vertexUV + vec2 (0.0, -2.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, vertexUV + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue3); - minValue3 = min(texture(iChannel0, vertexUV + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue3); + minValue3 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue3); + minValue3 = min(texture(iChannel0, texcoord + vec2 (0.0, -1.0) * filter_step ).rgb, minValue3); + minValue3 = min(texture(iChannel0, texcoord + vec2 (0.0, -2.0) * filter_step ).rgb, minValue3); + minValue3 = min(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue3); + minValue3 = min(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue3); vec3 minValue4 = vec3(1.0); - minValue4 = min(texture(iChannel0, vertexUV + vec2 (0.0, 0.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, vertexUV + vec2 (1.0, 0.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, vertexUV + vec2 (2.0, 0.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, vertexUV + vec2 (1.0, 1.0) * filter_step ).rgb, minValue4); - minValue4 = min(texture(iChannel0, vertexUV + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue4); + minValue4 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue4); + minValue4 = min(texture(iChannel0, texcoord + vec2 (1.0, 0.0) * filter_step ).rgb, minValue4); + minValue4 = min(texture(iChannel0, texcoord + vec2 (2.0, 0.0) * filter_step ).rgb, minValue4); + minValue4 = min(texture(iChannel0, texcoord + vec2 (1.0, 1.0) * filter_step ).rgb, minValue4); + minValue4 = min(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue4); // 2) dilation vec3 maxValue = vec3(0.0); @@ -214,7 +217,7 @@ vec3 convolution(mat3 kernel, vec2 filter_step) for (i = 0; i<3; ++i) for (j = 0; j<3; ++j) - sum += texture(iChannel0, vertexUV + filter_step * vec2 (i-1, j-1) ).rgb * kernel[i][j]; + sum += texture(iChannel0, texcoord + filter_step * vec2 (i-1, j-1) ).rgb * kernel[i][j]; return sum; } @@ -224,7 +227,7 @@ vec3 apply_filter() { vec2 filter_step = 1.f / textureSize(iChannel0, 0); if (filterid < 1 || filterid > 11) - return texture(iChannel0, vertexUV).rgb; + return texture(iChannel0, texcoord).rgb; else if (filterid < 5) return convolution( KERNEL[filterid], filter_step); else if (filterid < 6) @@ -313,10 +316,12 @@ float alphachromakey(vec3 color, vec3 colorKey, float delta) void main(void) { + // adjust UV + texcoord = vec2(uv.x, uv.y) + vertexUV * vec2(uv.z - uv.x, uv.w - uv.y); // deal with alpha separately - float ma = texture(iChannel0, vertexUV).a; -// float ma = texture(maskTexture, vertexUV).a * texture(iChannel0, vertexUV).a; + float ma = texture(iChannel0, texcoord).a; +// float ma = texture(maskTexture, texcoord).a * texture(iChannel0, texcoord).a; float alpha = clamp(ma * color.a, 0.0, 1.0); // read color & apply basic filterid diff --git a/rsc/shaders/simple.fs b/rsc/shaders/simple.fs index 3beb9f1..f1bd6b0 100644 --- a/rsc/shaders/simple.fs +++ b/rsc/shaders/simple.fs @@ -4,9 +4,11 @@ out vec4 FragColor; in vec4 vertexColor; -uniform vec4 color; // drawing color uniform vec3 iResolution; // viewport resolution (in pixels) +uniform vec4 color; // drawing color +uniform vec4 uv; + void main() { FragColor = color * vertexColor;