Растяжение текстуры по прямоугольной области в xna - PullRequest
0 голосов
/ 11 декабря 2011

У меня проблема с рисованием текстуры, растянутой по прямоугольной области в XNA.Для справки: это 3d-проект, где в каком-то месте я размещаю большой экран трансляции, «снимая» какую-то другую область.Это делается с помощью рендеринга, и текстура отображается очень хорошо (я проверил рендеринг в файл).Проблема в том, что когда я устанавливаю это как текстуру определенной области, отображаемая текстура состоит из плиток, как вы можете видеть на картинке, которую я загружаю.Область, где текстура должна быть растянута, определяется следующим образом:

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

И экран трансляции работает, но огни не работают.Может кто-нибудь сказать мне, пожалуйста, что я делаю не так?

1 Ответ

0 голосов
/ 13 декабря 2011

Как указано 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;
};

А теперь все работает хорошо.

...