2

DirectX を (再) 学習しており、HLSL コーディングに移行しました。カスタム .fx ファイルを使用する前に、クワッドの頂点バッファーを持つゲーム用のスカイボックスを作成しました。すべてが正常に機能しました...テクスチャがマッピングされ、美しくラップされました。しかし、頂点を管理するための HLSL セットアップができたので、クワッドが交わる独特の継ぎ目があります。テクスチャはすべて適切に並んでいます。このいまいましい継ぎ目を取り除くことはできません!

問題はtexCubeにあると思う傾向があります...または、ここにあるすべてのテクスチャ情報です。DX でクワッドをテクスチャリングしています... 2 つの間のリンクがまだ完全に得られていないだけかもしれません..よくわかりません。とにかく、事前に助けてくれてありがとう!

.fx ファイルは次のとおりです。

float4x4 World;
float4x4 View;
float4x4 Projection;

float3 CameraPosition;

Texture SkyBoxTexture; 

samplerCUBE SkyBoxSampler = sampler_state 
{ 
   texture = <SkyBoxTexture>; 
   minfilter = ANISOTROPIC; 
   mipfilter = LINEAR; 
   AddressU = Wrap; 
   AddressV = Wrap;
   AddressW = Wrap;
};

struct VertexShaderInput
{
    float4 Position : POSITION0;
};

struct VertexShaderOutput
{
    float4 Position : POSITION0;
    float3 TextureCoordinate : TEXCOORD0;
};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;

    float4 worldPosition = mul(input.Position, World);
    float4 viewPosition = mul(worldPosition, View);
    output.Position = mul(viewPosition, Projection);

    float4 VertexPosition = mul(input.Position, World);
    output.TextureCoordinate = VertexPosition - CameraPosition;

    return output;
}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    return texCUBE(SkyBoxSampler, normalize(input.TextureCoordinate));
}

technique Skybox
{
    pass Pass1
    {
        VertexShader = compile vs_2_0 VertexShaderFunction();
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}
4

3 に答える 3

1

クワッドを1つだけ使用してスカイボックスを描画することをお勧めします。必要なものはすべて、World * View * Projマトリックスの逆、つまり(World * View * Proj)^(-1)です。

クワッドの頂点は、(1、1、1、1)、(1、-1、1、1)、(-1、1、1、1)、(-1、-1、1、1)である必要があります。 )。

次に、VSでテクスチャ座標を計算します。

float4 pos = mul(vPos, WorldViewProjMatrixInv);
float3 tex_coord = pos.xyz / pos.w;

そして最後に、PSでテクスチャをサンプリングします。

float4 color = texCUBE(sampler, tex_coord);

縫い目は気になりません!:)

于 2012-05-08T19:34:29.157 に答える
1

継ぎ目を避けるには、できれば三角形のストリップを使用して、単一の DrawIndexedPrimitive 呼び出しでスカイボックスを描画する必要があります。個々のマトリックスなどで変換された個別のプリミティブとして各面を描画しないでください。継ぎ目ができます。説明のつかない理由でスカイボックス パーツに単一の DrawIndexedPrimitive 呼び出しを使用したくない場合は、すべての面が同じ行列 (すべての呼び出しで使用される同じワールド + ビュー + 投影行列) とコーナーの同じ座標値を使用して描画されるようにする必要があります。頂点 - つまり、「上面」面は、「側面」面で使用されるコーナーとまったく同じベクトル (位置) を使用する必要があります。

もう1つのことは、スカイボックスを次のように保存する必要があるということです

  1. キューブマップ (それがあなたがしているように見えます) - スカイボックス用に 8 つの頂点を作成し、それらをインデックス付きプリミティブとして描画します。
  2. または、未使用の領域が塗りつぶされたラップされていない「アトラス」テクスチャ。ボーダーカラー付き。

または、シェーダーに問題がない場合は、シェーダーを使用してスカイボックスを「レイトレース」できます。

于 2012-05-08T21:08:16.033 に答える
1

継ぎ目をなくすには、setsampler 状態でテクスチャ座標を固定する必要があります。このおもちゃメーカーのページでは、これについて説明しています。Toymaker は、Direct3D を学習するための優れたサイトです。さらに問題が発生した場合は、チュートリアルを確認してください。

于 2012-05-05T12:26:00.977 に答える