2016-07-14 7 views
2

Processingでシェーダを使用する際に問題が発生しているようです。私はインキ効果に取り組んでおり、シェーダの残りの部分を書くためにいくつかの助けを得た後、何かが起こるようには見えません。色は黒のままで、gl_FragColor = vertColorを変更すると変わりません。 (処理のために色を予約する)、画像は白色になります。私が理解していることから、その場合はまっすぐに通り過ぎるべきだから、今は何かが間違っていると思う。誰かアドバイスがありますか?処理フラグメントシェーダに何も表示されません

EDIT:他の処理シェーダーに表示されているものに近くなるように変更しました。 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

あなたはどのような効果を達成しようとしていますか?上のコードから、私は 'T'が浮動小数点変数であると仮定します。あたかも価値が与えられていないかのように見えます。私はそれがゼロに初期化されているか、またはヌルポインタとして扱われていることを意味していると仮定しています - したがって、おそらく、ゼロまたはF()関数から生じる他のエラーによる除算があります。私はどのようにglslがボンネットの下で動作するのか分かりません。 – Nolo

+0

ああ、気にしないでください。私の謝罪、私はちょうど '均一の定義を見上げた。 – Nolo

+0

私のクライアントプログラム(Processing)はTのフロートを送信していますが、問題はないようです。 – aceslowman

答えて

0

として何を設定されるだろう、あなたの元の質問に答えるカントあなたのコード:

1)inkspread.glslにはuniform sampler2D sourceが定義されていますが、あなたのシェイダー上でこれを統一します。 PImageオブジェクトまたはPGraphicsオブジェクトをこのユニフォームを介してシェーダーに渡したい場合は、Tと同じ方法でshader.set("source", photo)を呼び出す必要があります。しかし、処理はすでにあなたに無料のテクスチャを与えます。シェーダファイル全体でsourcetextureに変更すると、処理によって自動的にメイン図面キャンバスがシェーダのuniform sampler2D textureに渡されます。あなたの変更するvertTexCoordは、Processingが自動的にフラグメントシェーダを手渡す別の特別なプロパティです。それらのいくつかがありますが、私は彼らが現在よく文書化されているとは思わない。

2)2番目の問題は、image()& shader()の呼び出しの順番です。シェーダは画像の後処理を目的としているため、まず画像を描画してから、シェーダを呼び出してメイン図面キャンバスを操作します。それですべてが適切に動作するはずです。これは次のようになります。

void draw() { 
    image(photo,619,619); 
    shader.set("T",(float) millis()/1000.0); 
    shader(shader); 
} 

私はこの修正プログラムをテストしましたが、すべて動作します。私は意図した効果が何であるか分かりませんが、あなたのシェイダーは私の写真に素晴らしい暗闇/彩度の効果を与えました。

+0

ありがとう!私はまだシェイダー自体に行くいくつかの作業を持っていますが、これは実際にそれを稼働させるのに役立ちました。 – aceslowman

0

色は黒のまま、私はgl_FragColor = vertColorを変更したとき、 (Colroの処理予約)、画像は白になります。

vertColorは、色として解釈される頂点の位置であると仮定します。その場合、1より上のものはすべて1にクランプされます。頂点の位置が(1,1,1)の場合、色は白です。頂点の位置が(2,2,2)の場合、(1,1,1)にクランプされるため、色は再び白です。 少なくとも1つの位置の値が<である場合は、白以外の色になります。 ここで、vertColorを0(以前の位置座標の最小値)から1あなたの位置coordiantesの)

私はあなたがフロートの計算の多くを行うが、決定する方法がないよう、との問題のカップルがありますgl_FragColor

+0

私は浮動小数点演算の助けを借りていましたが、私はそれらがただ1つのカラーチャンネルを表すと仮定することができます(私はちょうどそれをvec3または何かに変更する必要があります)。私が見た他のProcessingシェーダでは、vertColorが0〜1のように扱われているように思われるので、vertColorのスケーリングは私にとっては奇妙に思えます。 – aceslowman

+0

私は同じ問題を抱えているvertColorの代わりにsampler2D(source、coord).rgbを使って更新しました。 – aceslowman

+0

'x'値を読み込むために計算された' c'値の代わりに 'verTexCoord.st'を使ってみてください。理想的なケースでは、とにかく目に見える効果はありませんが、今は問題を引き起こす可能性があります。glslのデフォルト設定についてはわかりません。 また、gl_FragColorで結果を使用しないで、結果が黒い画面でないかどうかを確認してください。 – Tare

関連する問題