web-dev-qa-db-ja.com

フラグメントシェーダー内のピクセル情報を取得するにはどうすればよいですか?

私のフラグメントシェーダーでは、テクスチャをロードして、次のようにできます。

uniform sampler2D tex;

void main(void) {
   vec4 color = texture2D(tex, gl_TexCoord[0].st);
   gl_FragColor = color;
}

これは、現在のピクセルをテクスチャのカラー値に設定します。私はこれらを変更することができ、それはうまくいきます。

しかし、いくつかの質問。 「どの」ピクセルかをどのように確認できますか?たとえば、ピクセル100,100(x、y)を赤に設定するとします。それ以外はすべて黒。どうすればよいですか:

"if currentSelf.Position()==(100,100); then color = red; else color = black?"

色の設定方法は知っていますが、「自分の」場所を取得するにはどうすればよいですか?

次に、隣接するピクセルから値を取得するにはどうすればよいですか?

私はこれを試しました:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);

しかし、それが何を返しているのかはっきりしていませんか?ピクセル100、100の場合。 101,100または100,101から値を取得するにはどうすればよいですか?

26
user697111

「どの」ピクセルかをどのように確認できますか?

あなたはピクセルではありません。あなたはフラグメントです。 OpenGLがそれらを「フラグメントシェーダー」と呼ぶのには理由があります。それはそれらがピクセルではないからですまだ。実際、マルチサンプリングのおかげで、(discardまたは深度テストなどを介して)ピクセルにならないだけでなく、複数のフラグメントを組み合わせてsingleピクセル。

フラグメントシェーダーがウィンドウ空間のどこにあるのかを伝えたい場合は、 gl_FragCoord を使用します。フラグメント位置は整数ではなく浮動小数点値であるため、単一の「100、100」値ではなく範囲でテストする必要があります。

次に、隣接するピクセルから値を取得するにはどうすればよいですか?

隣接するフレームバッファピクセルについて話している場合は、しないでください。フラグメントシェーダーは、独自の位置でも隣接する位置でも、フレームバッファーから任意に読み取ることはできません。

アクセスしたものから隣接するTexelにアクセスすることについて話している場合、それはtexture2Dに渡すテクスチャ座標にバイアスをかけるだけの問題です。テクスチャのサイズを取得する必要があります(GLSL 1.30以降を使用していないため、これを手動で渡す必要があります)、サイズを反転し、テクスチャ座標のSおよびTコンポーネントからこれらのサイズを加算または減算する必要があります。

31
Nicol Bolas

簡単な簡単。

解像度に基づいてピクセルのサイズを計算するだけです。次に、+ 1と-1を調べます。

vec2 onePixel = vec2(1.0, 1.0) / u_textureSize;
gl_FragColor = (
   texture2D(u_image, v_texCoord) +
   texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) +
   texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0))) / 3.0;

良い例があります ここ

3
newshorts