处理片段着色器不显示任何内容

时间:2016-07-14 21:46:25

标签: glsl processing

我似乎在设置着色器在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);
}

2 个答案:

答案 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);
}

我已经测试了这个修复程序,一切正常。我不确定预期的效果是什么,但你的着色器给我的照片带来了很好的变暗/饱和效果。

相关问题