在xna中的矩形区域上拉伸纹理

时间:2011-12-11 00:52:45

标签: xna textures stretch tile vertex

我在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 :(得分: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;
};

现在效果很好。