私のフラグメントシェーダーでは、テクスチャをロードして、次のようにできます。
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から値を取得するにはどうすればよいですか?
「どの」ピクセルかをどのように確認できますか?
あなたはピクセルではありません。あなたはフラグメントです。 OpenGLがそれらを「フラグメントシェーダー」と呼ぶのには理由があります。それはそれらがピクセルではないからですまだ。実際、マルチサンプリングのおかげで、(discard
または深度テストなどを介して)ピクセルにならないだけでなく、複数のフラグメントを組み合わせてsingleピクセル。
フラグメントシェーダーがウィンドウ空間のどこにあるのかを伝えたい場合は、 gl_FragCoord
を使用します。フラグメント位置は整数ではなく浮動小数点値であるため、単一の「100、100」値ではなく範囲でテストする必要があります。
次に、隣接するピクセルから値を取得するにはどうすればよいですか?
隣接するフレームバッファピクセルについて話している場合は、しないでください。フラグメントシェーダーは、独自の位置でも隣接する位置でも、フレームバッファーから任意に読み取ることはできません。
アクセスしたものから隣接するTexelにアクセスすることについて話している場合、それはtexture2D
に渡すテクスチャ座標にバイアスをかけるだけの問題です。テクスチャのサイズを取得する必要があります(GLSL 1.30以降を使用していないため、これを手動で渡す必要があります)、サイズを反転し、テクスチャ座標のSおよびTコンポーネントからこれらのサイズを加算または減算する必要があります。
簡単な簡単。
解像度に基づいてピクセルのサイズを計算するだけです。次に、+ 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;
良い例があります ここ