2011-06-24 2 views
4

私は頂点シェーダ(glsl)2テクスチャに渡しています:スクリーンから、より小さいノーマルマップ。 ノーマルマップは画面サイズに合わせてスケーリングされます。したがって、最初のテクスチャが1152×864ピクセルで、ノーマルマップが256×256の場合、サイズはそれより大きくなります。シェーダのタイルテクスチャ

どのようにタイル張りにすることができますか?例えば。サイズを256×256にして、すべてのテクスチャをタイルします。


UPD

[0.17, 0.61, 0.33, 0.83] 

の代わりに::

[0, 0, 1, 1] 

私の通常のこの道を

例えば、私のメインの(大きな)テクスチャは、このようにマッピングされていますテクスチャは最初の座標に対してもマッピングされます。だから私はそれの小さなマップ矩形を参照してください。フルサイズのシェーダでどのようにマップできますか?

+0

OpenGLについてはDunnoですが、DirectXではサンプラーの使用例です。 OGLには同様のものがあります。 –

答えて

6

それは大きなへのサイズから縮小されます。

いいえ、それは最も確かではないでしょう。これはテクスチャに関する一般的な誤解です。テクスチャはファンシールックアップテーブルにすぎません。テクスチャは互いに相対的にスケーリングされません。それはあなたが使用するテクスチャ座標の単なる質問に過ぎません。すべての可能性で

、何をやっていることは同じテクスチャが法線マップとして画面のテクスチャ座標使用しています。正規化されたテクスチャ座標について話す可能性が高いので、同じ[0、1]の範囲をそれらの両方にマッピングしていることになります。

あなたが話している効果を得るために、あなたは彼らが何をする必要があるか行う通常のテクスチャ用のテクスチャ座標を計算する必要があります。したがって、スクリーンテクスチャに相対的なテクスチャ座標がある場合、それを通常のテクスチャのために必要なスペースに変換する必要があります。

それを行うにはいくつかの方法があります。手作業では、CPU上のテクスチャのサイズの比率を計算し、それをシェーダに渡します。あなたが与えてくれた数字を使用して、サイズ比は次のようになります。

(1152.0/256.0, 864.0/256.0) = (4.5, 3.375). 

これは浮動小数点演算で行われていることを確認します。一度行われ、単にサンプリング前シェーダでは、この比によってテクスチャ座標を均一に沿ってこれを通過して、乗算:

uniform vec2 textureRatio; 

void main() { 
//Get the texture coordinate. 
vec4 screenTexColor = texture(screenTex, texCoord); 
vec2 normTexCoord = textureRatio * texCoord; 
vec4 normalValue = texture(normalTex, normTexCoord); 
//Do something with these. 
} 

GLSLにおける自動方法がシェーダーで直接これを実行することです。これには、GLSL 1.30以上が必要です。基本的に、あなたは比率を計算するために、言語の使用可能な機能を使用します。これらの例の両方で

void main() { 
//Get the texture coordinate. 
vec2 textureRatio = textureSize(screenTex)/textureSize(normalTex); 
vec4 screenTexColor = texture(screenTex, texCoord); 
vec2 normTexCoord = textureRatio * texCoord; 
vec4 normalValue = texture(normalTex, normTexCoord); 
//Do something with these. 
} 

を、私はあなたのGL_TEXTURE_WRAP_S/Tは、適切なテクスチャやサンプラーのパラメータでGL_REPEATするように設定されていると仮定しています。

はCPUに比率を計算し、均一にそれを渡すとそうシェーダでそれを計算するよりも高速になりますのでご注意ください。特にフラグメントシェーダーの場合、非常に多くの処理が実行されます。

+0

良い答えですが、1.30のフィーチャでも、すべてのフラグメントに対して一定の比率の計算を行うのは良い考えではないかもしれません。あるいは、悪いことには、初心者がすべてのフラグメントに対して一定の値を再計算するよう勧めます。私はそれを最適化するために非常に最適化されたGLSLコンパイラが必要だと思います。 –

+0

@Christian Rau:同意しました。しかし彼は、彼が "頂点シェーダ(glsl)2テクスチャに渡していた"と言っていました。今、彼は実際にやっているように見えるものは何も意味をなさないが、それは彼が言ったことだ。だから彼が頂点シェーダからこれらにアクセスしているのなら、おそらくそれほど悪くはありません。しかし、パフォーマンスの影響についての注意を追加します。 –

+0

bolas素晴らしい答え、ありがとう!真実を伝えるために、私はあなたが考えることができるように初心者ではありません。私の英語はとても純粋なので、私が本当に思っていることを教えてくれません:) – Ockonal