2012-05-05 31 views
2

私はDirectXを学び、HLSLコーディングに移行しました。私のカスタム.fxファイルを使用する前に、クワッドの頂点バッファを持つゲーム用のスカイボックスを作成しました。すべてうまくいきました...テクスチャがマップされ、美しく包まれました。しかし、頂点を管理するためのHLSLセットアップがあるので、クワッドが合う特徴的な継ぎ目があります。テクスチャはすべて適切に整列しています。私はちょうどこの気味の縫い目を取り除くことができません!HLSLとDXスカイボックスの問題(継ぎ目の作成)

私はこの問題がtexCube ...というか、むしろすべてのテクスチャ情報がここにあると思う傾向があります。私はDXのクワッドをテクスチャリングしています...それはまだ私はまだ2つの間のリンクを取得していない可能性があります。とにかく事前に助けてくれてありがとう!

相続人のFreeBSDファイル:

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(); 
    } 
} 

答えて

1

シームレスを避けるには、好ましくは三角形ストリップを使用して、1回のDrawIndexedPrimitive呼び出しでskyboxを描画する必要があります。それぞれの面を個々の行列などで変換された別のプリミティブとして描画しないでください。縫い目ができます。説明できない理由のためにskybox部品のために単一のDrawIndexedPrimitiveコールを使用したくない場合は、すべての面が同じ行列(すべての呼び出しで同じワールド+ビュー+投影行列)を使用して描画され、コーナー頂点 - つまり、「上」の面は、「面」面で使用されるコーナーにまったく同じベクトル(位置)を使用する必要があります。 、スカイボックスのためにわずか8頂点を作る原始的なインデックス付きとしてそれらを描く -

もう一つは、あなたが

  1. キューブマップとしてストアスカイボックスのいずれかが(それはあなたが何をやっているように見えます)すべきであるということです。
  2. 未使用領域が塗りつぶされているアンラップ「アトラス」テクスチャ。ボーダーカラー。

シェイダーがうまくいけば、シェイダーを使ってスカイボックスを「レイトレース」することができます。

1

あなたはテクスチャをクランプする必要があるが、継ぎ目を取り除くためにsetsampler状態に調整します。このtoymakerページでこれが説明されています。 ToymakerはDirect3Dを学ぶのに最適なサイトです。それ以上の問題がある場合はチュートリアルをチェックしてください。

+0

私はクランプのコンセプトを理解しています...そして述べたように、HLSLの外にあるこのスカイボックスには問題ありません...クワッドがレンダリングされた後にレンダリング状態を設定すると、完全に動作します。問題はシェーダを使用しているためです。問題は.fxファイルから来ています。 ここではtex座標にCLAMPパラメータを使用していますが、それは動作しません。折り返し(ここで使用しているもの)は機能しますが、継ぎ目があります。私は四角形からボックスを作ったので、私はそれを仮定していますが、私はHLSLのtexCUBE関数を使っています。実際のトラブルは私が代わりに使うべきものです。(私が正しいと仮定して) –

+0

FYI私はちょうどあなたのシェーダを試して、それは縫い目なしで働いた。おもちゃ用には – CarlJohnson

+0

+1。 – Jono

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); 

任意の縫い目の心配を! :)

+0

ワールド変換は、カメラの位置への変換である必要があります。 – miloszmaki