3

こんにちは皆さん、これは簡単な作業のはずですが、何らかの理由でうまくいきません...

シェーダーを使用してシーンの深度を視覚化したいだけです。

float4x4 matViewProjection;
float4x4 matWorld;
float4 eyePos;

struct VS_OUTPUT 
{
  float4 position : POSITION0;
  float depth : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );

 float3 posWorld = mul(input.position, matWorld);
 output.depth = distance(posWorld, eyePos);
 return( output );
}

深さの値を取得するには (またはそう思った)、ワールド空間内の位置とビュー位置の間の距離を計算します。

そして対応するピクセルシェーダー

float4 ps_main(VS_OUTPUT input) : COLOR0
{   
   float depth = input.depth;
   return float4(depth, depth, depth, 1.0f);
}

白い色しか得られない

そこで、値を深さまで乗算する試行錯誤を開始しました。

float depth = input.depth * 0.005f;

対象物までの距離に応じて満足のいく結果が得られます。そのため、オブジェクトに近づくと、値を再度調整する必要があります。

だから何か非常に間違っている...

読んでくれてありがとう!

4

2 に答える 2

5

あなたの問題は、どの時点でも深さの値を正規化していないことです。ZNear から ZFar の範囲内であればどこでもかまいません。

vert シェーダーで次のことを試してください。

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );
 output.depth    = output.position.z / output.position.w;
 return( output );
}

w 分割後、有効な Z 値は 0 から 1 の範囲になります。この範囲にない Z 値は錐台の外側 (ニア クリッピング プレーンの前またはファー クリッピング プレーンの後ろ) にあるため、優先されます。とにかく、ピクセル シェーダーにはアクセスしないでください。

于 2010-10-16T13:50:08.473 に答える
2

ほんの少しの追加:使用

output.depth    = output.position.z / output.position.w;

距離に沿って暗い色から明るい色になりますが、

output.depth    = 1.0f - (output.position.z / output.position.w);

明るい色から暗い色になりますが、これも正しいことを願っています。

于 2010-10-16T16:23:13.480 に答える