0

XNA で長方形の領域に引き伸ばされたテクスチャの描画に問題があります。いくつかの背景について: これは 3D プロジェクトで、どこかの場所に大きな放送スクリーンを置いて、他のエリアを「撮影」しています。これは renderstates によって行われ、テクスチャは完全に適切にレンダリングされます (ファイルにレンダリングして確認しました)。問題は、これを定義した領域のテクスチャとして設定すると、アップロードしている画像でわかるように、マップされたテクスチャがタイルで構成されていることです。テクスチャが引き伸ばされる領域は、次のように定義されます。

VertexPositionNormalTexture[] vertices = new VertexPositionNormalTexture[6];
vertices[0].Position = new Vector3(0.0F, 20.0F, 0.0F);
vertices[0].TextureCoordinate.X = 0;
vertices[0].TextureCoordinate.Y = 0;

vertices[1].Position = new Vector3(50.0F, 0.0F, 0.0F);
vertices[1].TextureCoordinate.X = 1f;
vertices[1].TextureCoordinate.Y = 1f;

vertices[2].Position = new Vector3(0.0F, 0.0F, 0.0F);
vertices[2].TextureCoordinate.X = 0f;
vertices[2].TextureCoordinate.Y = 1f;

vertices[3].Position = new Vector3(50.0F, 0.0F, 0.0F);
vertices[3].TextureCoordinate.X = 1f;
vertices[3].TextureCoordinate.Y = 1f;

vertices[4].Position = new Vector3(0.0F, 20.0F, 0.0F);
vertices[4].TextureCoordinate.X = 0f;
vertices[4].TextureCoordinate.Y = 0f;

vertices[5].Position = new Vector3(50.0F, 20.0F, 0.0F);
vertices[5].TextureCoordinate.X = 1f;
vertices[5].TextureCoordinate.Y = 0f;


telebimBuffer = new VertexBuffer(GraphicsDevice, VertexPositionNormalTexture.VertexDeclaration, vertices.ToList().Count, BufferUsage.WriteOnly);
telebimBuffer.SetData<VertexPositionNormalTexture>(vertices);

私が心配しているのは、テクスチャ座標で遊んでみましたが、違いが見られなかったことです:/。私は自分の効果ファイルでレンダリングしています。これが問題の原因になる可能性があります。このファイルは次の場所から入手できます: http://gamma.mini.pw.edu.pl/~zabak/random/PhongAlternative.fx

レンダリングされたテクスチャは、「xTexture」としてエフェクト ファイルに渡されます。

最後に、私の問題を示す画面: http://gamma.mini.pw.edu.pl/~zabak/random/gk3d_2error.jpg ご覧 のとおり、ブロードキャスト画面に多数のタイルが表示されます。目標は取得することですテクスチャが伸びました。(スクリーンショットを作成する目的で、コメントしてライトをオフにしました

color = (color+specular+diffuse*diffuseIntensity+ambientLightColor)+light1+light2+light3;

私の効果ファイルの行。)

更新:エフェクトファイルの宣言を次のファイルから変更しました:

struct VertexShaderOutputPerPixelDiffuse
{
 float4 Position : POSITION;
 float3 WorldNormal : TEXCOORD0;
 float3 WorldPosition : TEXCOORD1;
 float2 TextureCoords: TEXCOORD2;
 };

これに:

struct VertexShaderOutputPerPixelDiffuse
{

 float4 Position : POSITION;
 float3 WorldNormal : TEXCOORD0;
 float3 WorldPosition : TEXCOORD2;
 float2 TextureCoords: TEXCOORD1;
};

放送画面は機能しますが、ライトがめちゃくちゃです。誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

0

borillisが指摘したように、VertexShader の出力が PixelShader の入力と一致しないという問題がありました。PixelShader 入力を次のように変更しました。

struct PixelShaderInputPerPixelDiffuse
{
 float4 Position : POSITION;
 float3 WorldNormal : TEXCOORD0;
 float3 WorldPosition : TEXCOORD2;
 float2 TextureCoords: TEXCOORD1;
};
struct VertexShaderOutputPerPixelDiffuse
{
 float4 Position : POSITION;
 float3 WorldNormal : TEXCOORD0;
 float3 WorldPosition : TEXCOORD2;
 float2 TextureCoords: TEXCOORD1;
};

そして今、それはうまくいきます。

于 2011-12-13T17:46:47.387 に答える