- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的 GL 4.5 应用程序中实现软刷。我已经实现了 100% 的硬刷,但软刷功能低于标准。我尝试实现的这种绘画模式在 Krita 中称为“水洗”绘画,是 GIMP 中的普通模式。
例如:在 Photoshop 中,我有一个硬度低且不透明度为 10% 的圆刷,按住鼠标并拖动光标,我得到一个均匀的笔触,纹理构建为10% 的不透明度,除了它淡出的边缘。如果我再次单击,由于添加剂混合 (?),它会增加 10% 的白色。
在我使用软笔刷纹理的应用程序中,由于纹理的不透明度逐渐降低,我总是会在鼠标移动时出现条纹。在混合当前笔划和 BG 纹理后,我尝试了各种混合模式并限制不透明度,它们或多或少看起来如下所示:
pPaintStroke_washF 全屏四边形着色器
#version 450 core
#extension GL_ARB_bindless_texture : require
in Vert
{
vec2 uv;
} v;
layout(bindless_sampler, location = 0) uniform sampler2D blended_64; // blended bg + stroke
layout(location = 0) out vec4 Ci;
uniform vec4 brushRGBA = vec4(1.f, 1.f, 1.f, .001f);
void main()
{
vec4 blended = texture(blended_64, v.uv);
if (blended.a == 0.f)
Ci = vec4(0.f);
else
{
Ci.rgb = brushRGBA.rgb;
Ci.a = clamp(blended.a, 0.f, brushRGBA.a);
// Ci.a = clamp(blended.a, blended.a, brushRGBA.a);
}
}
申请
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
for (int i = 0; i < Bresenham.size(); ++i)
{
/*
//bind brushTempN.fbo1
//render Bresenham[i] into it
*/
glBindFramebuffer(GL_FRAMEBUFFER, brushTempN.fbo1);
glViewport(0, 0, brushTempN.width, brushTempN.height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.f, 0.f, 0.f, 0.f);
myWin.myGLWidgetSh->glUseProgram2("pPaintStroke_unwashed");
myWin.paintStroke->s->val_3 = glm::vec3((float)Bresenham[i].size / 100);
myWin.paintStroke->t->val_3 = glm::vec3(Bresenham[i].coord, 0.f);
myWin.paintStroke->mvpGet(myWin.allGL[GLidx]);
myWin.paintStroke->render(myWin.allGL[GLidx]);
/*
//bind brushTempN.fbo2
//render bg - starts as 0 (brushBGN.tex1)
//render curr stroke (brushTempN.tex1)
//this blends them
*/
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindFramebuffer(GL_FRAMEBUFFER, brushTempN.fbo2);
glViewport(0, 0, brushTempN.width, brushTempN.height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.f, 0.f, 0.f, 0.f);
myWin.myGLWidgetSh->glUseProgram2("pPaintStroke_washBlend");
washBlendPhase = 0; myWin.myFSQ->render(myWin.allGL[GLidx]); //render BG
washBlendPhase = 1; myWin.myFSQ->render(myWin.allGL[GLidx]); //render the curr stroke (brushTempN.tex1)
/*
//bind brushN.fbo1
//read brushTempN.tex2_64
//clamp the blended alpha with Ci.a = clamp(in.a, 0.f, brushRGBA.a)
*/
glBindFramebuffer(GL_FRAMEBUFFER, brushN.fbo1);
glViewport(0, 0, brushN.width, brushN.height);
myWin.myGLWidgetSh->glUseProgram2("pPaintStroke_wash");
myWin.myFSQ->render(myWin.allGL[GLidx]);
/*
//bind brushBGN.fbo1
//copy the above brushN.tex1 into it
*/
glBindFramebuffer(GL_FRAMEBUFFER, brushBGN.fbo1);
glViewport(0, 0, brushBGN.width, brushBGN.height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.f, 0.f, 0.f, 0.f);
myWin.myGLWidgetSh->glUseProgram2("pPaintStroke_washBlend");
washBlendPhase = 2; myWin.myFSQ->render(myWin.allGL[GLidx]); //render new BG
}
最佳答案
您也应该使用添加剂混合。
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
关于c++ - 柔软、透明的笔画纹理没有像我预期的那样混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33738442/
我正在开发一个基于fabricjs 的图表工具。我们的工具有我们自己的形状集合,它是基于 svg 的。我的问题是当我缩放对象时,边框(描边)也会缩放。我的问题是:如何缩放对象但保持笔触宽度固定。请检查
我在 Canvas 上画线时遇到一点问题, 基本上我希望线条漂亮、柔软且半不透明,但 Canvas 似乎只想对最后渲染的线段执行此操作。 看看这里,您会看到最后绘制的线段很好,而且..我想要它)但是随
也许这是一个错误,但请检查一下。 https://codepen.io/Firsh/pen/LegGQq /* Only these work:*/ /* symbol{ overflow: visi
我已经在终端中启动了一个 python 脚本(该终端已关闭)并将其发送到后台。现在这个程序需要一些来自键盘的输入并一直等待。如何将输入“y\n”(字母“y”后跟一个 Enter)发送到该程序?假设它的
我想实现这样的效果: 有人知道如何在 Canvas 上画这样一条线吗? 最佳答案 再靠近一点: chalkPaint = new Paint(); chalkPaint.setStyl
我建立了一个very simple Twitter Instant Search为了好玩,使用 jQuery 和 PHP。我将一个事件绑定(bind)到搜索表单上的 keyup,并对 PHP 页面进行
使用通用 Windows 平台 (UWP) 使用 InkCanvas 控件 我似乎无法确定在使用 InkCanvas 时删除墨迹笔划的正确方法 - 有一个可以处理的事件“StrokeErased”。
我是一名优秀的程序员,十分优秀!