使用令人惊叹的 GPU 图像框架,我正在尝试使用自定义片段着色器创建一个自定义过滤器,该着色器将一些颜色向量作为制服传递,详细说明每个片段用制服中的一种颜色替换选择的颜色。我使用 Quartz 做到了这一点,它可以工作,但是由于我正在使用这个框架在 OpenGL 世界中迈出第一步,所以我想尝试一下 GPU 处理。
我制作的片段着色器似乎工作正常,但输出有问题。我只发布了一个调试 porpoise 的示例
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
bool compareVectors (lowp vec3 x,lowp vec3 y){
bool result;
if (x.r != y.r) {
return result = false;
}
if (x.b != y.b) {
return result = false;
}
if (x.g != y.g ) {
return result = false;
}
return result = true;
}
void main()
{
lowp vec3 tc = vec3(0.0, 0.0, 0.0);
lowp vec4 pixcol = texture2D(inputImageTexture, textureCoordinate).rgba;
lowp vec3 sampleColors[3];
lowp vec3 newColors[3];
sampleColors[0] = vec3(0.2, 0.2, 0.2);
sampleColors[1] = vec3(0.0, 0.0, 0.0);
sampleColors[2] = vec3(1.0, 1.0, 1.0);
newColors[0] = vec3(0.4, 0.4, 1.0);
newColors[1] = vec3(0.3, 0.4, 1.0);
newColors[2] = vec3(0.6, 0.7, 0.5);
if (pixcol.a >= 0.2) {
if (compareVectors (sampleColors[0],pixcol.rgb))
tc = newColors[0];
else if (compareVectors (sampleColors[1],pixcol.rgb))
tc = newColors[1];
else if (compareVectors (sampleColors[2],pixcol.rgb))
tc = newColors[2];
else
tc = pixcol.rgb;
}
else
tc = pixcol.rgb;
gl_FragColor = vec4(tc.rgb, pixcol.a);
}
生成的图像有很多伪影。如果写入磁盘,它在屏幕上似乎是像素化的,并且创建得不好。这是一些屏幕。
第一张是起始图,第二张是过滤后的法师在iphone屏幕上的截图,第三张是写入磁盘的过滤后的图像。深入研究我记得纹素和像素不是一回事,所以可能我没有正确映射它们。我想要一个 1:1 的位置比率,但可能不会发生。
我怎样才能做到这一点?
谢谢,安德里亚