2012-02-22 5 views
0

私は、Photoshopレベルの出力スライダと同じ仕事をするフラグメントシェーダを作成しようとしています。私は特定のチャンネル(この場合は青色)でこれをやりたいと思います。フラグメントシェーダ - ブルーチャネルレベルの出力スライダを再現

私は以下のようにコードを持っている:私はラインでより多くしなければならないことだと思うので、

varying highp vec2 textureCoordinate; 

uniform sampler2D inputImageTexture; 

#define GammaCorrection(color, gamma)  pow(color, vec3(1.0/gamma)) 

#define LevelsControlOutputRange(color, minOutput, maxOutput) mix(vec3(minOutput/255), vec3(maxOutput/255), color) 


void main() 
{ 

    lowp vec4 texel = texture2D(inputImageTexture, textureCoordinate); 

    lowp vec3 outputColor; 
    outputColor.rgb = texel.rgb; 

    lowp vec3 pass3 = LevelsControlOutputRange(outputColor,200,255); 

    lowp vec4 pass4; 
    pass4.r = outputColor.r; 
    pass4.g = outputColor.g; 
    pass4.b = pass3.b; 

gl_FragColor = pass4; 


} 

これは、得られた画像には影響ありません:

pass4.b = pass3.b; 

誰が助けてもらえ正しい方向に私を向ける?

おかげ

答えて

0

mixは、混合パラメータとして0〜1の間の値をとります。あなたの255は1にクランプされるので、あなたは常に最大出力値を得ます。同様の方法で、テクスチャの値は0〜1の範囲にあり、ある範囲に入るには255で割り切ってはいけません! BTW:255で簡単に除算が正しくない - 詳細はこちらhttp://kaba.hilvi.org/programming/range/index.htm

+0

ここで定義されているマクロを使用していただきありがとうございます。http://mouaif.wordpress.com/2009/01/28/levels-control-shader /ここで彼は値を255で割ります、それは間違っていますか? – Skeep

+0

@Skeep:ソースコードのあるサーバーがダウンしているようですが、記事では255で割ることはありません。シェーダコードで整数テクスチャが使用されているかもしれません。とにかく:これのためにマクロを使うべきではありません。関数を使用します。マクロは、関数のローカルデータで繰り返し実行されるような、関数にうまく収まらないものを対象としています。 – datenwolf

+0

私は正しい方向に向いてくれてありがとう – Skeep

関連する問題