0

私がやっていることは、法線マップを使用して2Dスプライトを照らすことです。もともと私は画像の赤チャンネルでバンプ/高さマップを使用し、他の2つのチャンネルを使用して他の情報を保存するつもりでした。私が思ったのは、法線マップ上の法線は常に[0 .. 1]の範囲のaz値を持つことがわかっているので、この情報を青チャンネルから除外し、xの長さに基づいてz値を計算できるということでした。およびy値。それで試してみましたが、今のところうまくいくようで、オリジナルとほぼ同じに見えます。

私の質問は、追加の指示の費用はいくらですか?いくつかの追加の乗算と加算、およびさらに2つの平方根呼び出しがあります。

使用されるフラグメントシェーダーは次のとおりです。

// Input >
//   fc0 : Color to normal conversion factor - <2, 1, 0, 0>
//   fc1 : Light - <lightDirection.x, lightDirection.y, lightDirection.z>
//   v0  : texture coordinates - <u, v>
//   fs0 : color texture
//   fs1 : normal map

// Sample normal map (fs1) at coordinates (v0) into temp register (ft0)
tex ft0 v0 fs1 <2d,nearest>
// Convert color values [0, 1] to normal values [-1, 1]
mul ft0 ft0 fc0.xxx
sub ft0 ft0 fc0.yyy

//
// The code below is used to calculate the z value from the
// 2D x/y normal values
// 

// <Start normal z calculation>

// (ft0) should now hold a 2D vector - first find its length
// - length = sqrt(x * x + y * y)
mul ft1.x ft0.x ft0.x // x * x
mul ft1.y ft0.y ft0.y // y * y
add ft1.z ft1.x ft1.y // (x * x + y * y)
sqt ft1.z ft1.z // ft1.z = sqrt(x * x + y * y)
// Now using the length of the 2D normal find the z value
// - z = sqrt(1 - length * length)
mul ft1.z ft1.z ft1.z // length * length
sub ft1.z fc0.y ft1.z // 1 - length * length
sqt ft1.z ft1.z // ft1.z = sqrt(1 - length * length)
// Now move the z value into temp register (ft0) along with the normal x and y value
mov ft0.z ft1.z

// <End normal z calculations>

// The rest of the shader left out
4

1 に答える 1

0

sqrtは非常に遅い動作です。したがって、可能な限り回避する必要があります。実際、法線マッピングの前は、高さを表すグレースケール画像のみを使用したバンプマッピングでした。この場合、通常は隣のピクセルに基づいて計算されます。しかし、ハードウェアメモリが大きくなったときは、節約する価値はありません。しかし、モバイルでは

于 2012-12-07T08:11:03.713 に答える