我似乎在设置着色器在Processing中工作时出现问题。我正在研究墨水效果,在获得一些帮助来编写着色器的其余部分后,我似乎无法发生任何事情。颜色保持黑色,当我改变gl_FragColor = vertColor时; (其中处理为颜色保留),图像变为白色。根据我的理解,在这种情况下它应该直接通过,所以现在我相信某些事情可能是错的。有没有人有一些建议?
编辑:我做了一些更改,试图将其与我在其他处理着色器中看到的更接近。而不是vertColor我现在使用的是sampler2D(source,coord).rgb,它仍然无效。
PShader shader;
PImage photo;
void setup() {
size(619,619,P2D);
photo = loadImage("paintedsky.jpg");
shader = loadShader("inkspread.glsl");
}
void draw() {
shader.set("T",(float) millis()/1000.0);
shader(shader);
image(photo,619,619);
}
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
#define PROCESSING_TEXTURE_SHADER
uniform sampler2D source;
varying vec4 vertTexCoord;
uniform float T;
const float diag = 1.414213562373095;
vec3 F(vec3 x0,vec3 x1,float dist){
return (x1 - x0)/(T * dist);
}
void main() {
vec2 ix = vertTexCoord.st;
vec2 c11 = vertTexCoord.st + vec2( 0.0, 0.0);
vec2 c01 = vertTexCoord.st + vec2(-1.0, 0.0);
vec2 c21 = vertTexCoord.st + vec2( 1.0, 0.0);
vec2 c10 = vertTexCoord.st + vec2( 0.0,-1.0);
vec2 c12 = vertTexCoord.st + vec2( 0.0, 1.0);
vec2 c00 = vertTexCoord.st + vec2(-1.0,-1.0);
vec2 c02 = vertTexCoord.st + vec2(-1.0, 1.0);
vec2 c20 = vertTexCoord.st + vec2( 1.0,-1.0);
vec2 c22 = vertTexCoord.st + vec2( 1.0, 1.0);
vec3 x11 = texture2D(source, c11).rgb;
vec3 x01 = texture2D(source, c01).rgb;
vec3 x21 = texture2D(source, c21).rgb;
vec3 x10 = texture2D(source, c10).rgb;
vec3 x12 = texture2D(source, c12).rgb;
vec3 x00 = texture2D(source, c00).rgb;
vec3 x02 = texture2D(source, c02).rgb;
vec3 x20 = texture2D(source, c20).rgb;
vec3 x22 = texture2D(source, c22).rgb;
vec3 d01 = F(x11,x01,1.0);
vec3 d21 = F(x11,x21,1.0);
vec3 d10 = F(x11,x10,1.0);
vec3 d12 = F(x11,x12,1.0);
vec3 d00 = F(x11,x00,diag);
vec3 d02 = F(x11,x02,diag);
vec3 d20 = F(x11,x20,diag);
vec3 d22 = F(x11,x22,diag);
vec3 result = (x11 + d01+d21+d10+d12 + d00+d02+d20+d22);
vec3 col = texture2D(source, ix).rgb;
gl_FragColor = vec4(col*result,1.0);
}
答案 0 :(得分:0)
颜色保持黑色,当我改变gl_FragColor = vertColor时; (其中处理为colro保留),图像变为白色。
我假设vertColor是被解释为颜色的顶点的位置。在这种情况下,1以上的所有内容都被限制为1,因此如果您的顶点位置为(1,1,1),则颜色为白色。如果顶点位置为(2,2,2),它将被夹紧到(1,1,1),因此颜色再次变为白色。 您将具有非白色,其中至少一个位置值<1。 出于测试目的,您可以尝试将vertColor从0(以前是位置坐标的最低位置)缩放到1(以前是位置协调器的最高位置)
我无法回答您的原始问题,因为您进行了大量的浮点计算,但没有办法确定,将设置为gl_FragColor
答案 1 :(得分:0)
您的代码存在一些问题:
1)在inkspread.glsl
中,您已定义uniform sampler2D source
,但您从未在着色器上设置此制服。如果您想通过此制服将PImage或PGraphics对象传递到着色器,则必须按照与shader.set("source", photo)
传递时间相同的方式调用T
。但是,Processing已经为您提供了免费的纹理。如果您在整个着色器文件中将source
更改为texture
,则Processing会自动将主绘图画布传递到着色器的uniform sampler2D texture
。您的变化vertTexCoord
是另一个特殊属性,Processing会自动处理您的片段着色器。还有其中一些,但我认为它们目前没有充分记录。
2)第二个问题是图像的顺序()&amp; shader()调用。由于着色器旨在对图像进行后处理,因此您需要先绘制图像,然后调用着色器以在主绘图画布上进行操作。一切都应该正常。它应该是这样的:
void draw() {
image(photo,619,619);
shader.set("T",(float) millis()/1000.0);
shader(shader);
}
我已经测试了这个修复程序,一切正常。我不确定预期的效果是什么,但你的着色器给我的照片带来了很好的变暗/饱和效果。