【发布时间】:2019-08-24 19:33:09
【问题描述】:
对于上下文:
我正在使用 OpenFrameworks 制作生成式 2D 动画。 我正在尝试实现一个着色器,根据形状边缘的方向,用颜色填充一些形状。
基本上它需要一张像这样的图像:
然后吐出这样的东西:
请注意,它故意只采用形状左侧的颜色。
现在我的片段着色器看起来像这样:
#version 150
out vec4 outputColor;
uniform sampler2DRect fbo;
uniform sampler2DRect mask;
vec2 point;
vec4 col;
float x,i;
float delta = 200;
vec4 extrudeColor()
{
x = gl_FragCoord.x > delta ? gl_FragCoord.x - delta : 0;
for(i = gl_FragCoord.x; i > x; i--)
{
point = vec2(i, gl_FragCoord.y);
if(texture(fbo, point) != vec4(0,0,0,0)){
col = texture(fbo, point);
return vec4(col.r, col.g, col.b, (i-x)/delta);
}
}
return vec4(0,0,0,1);
}
void main()
{
outputColor = texture(mask, gl_FragCoord.xy) == vec4(1,1,1,1) && texture(fbo, gl_FragCoord.xy) == vec4(0,0,0,0) ? extrudeColor() : vec4(0,0,0,0);
}
mask 采样器只是第二张图像的黑白版本,我用它来避免计算形状之外的像素。
我的着色器可以工作,但速度很慢,而且我觉得我没有使用正确的 GPU 思维和编码。
实际的、更一般的问题:
我对 glsl 和 opengl 完全陌生。有没有一种方法可以更有效地通过相邻像素进行这种迭代,而无需读取这么多的texture()?
也许使用矩阵? IDK!
【问题讨论】: