1

如何为 2D 设置世界、视图和投影?[XNA 3.1,C#]

我正在尝试使用需要的着色器

float4x4 World;
float4x4 View;
float4x4 Projection;

但我不知道如何使用 2D 引擎设置它们。我的意思是我真的不知道应该为使用 2D 计算的正确顶点着色器传递什么值。

代码:

efs[ObjShaders[i].ShaderID].effect.Parameters["World"].SetValue(Matrix.Identity);

efs[ObjShaders[i].ShaderID].effect.Parameters["View"].SetValue(Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)));

efs[ObjShaders[i].ShaderID].effect.Parameters["Projection"].SetValue(Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),aspectRatio,1.0f, 10.0f));

efs[ObjShaders[i].ShaderID].effect.Parameters["EyePos"].SetValue(new Vector3(0,0,0));

着色器部分:

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;

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

output.texCoord = input.texCoord*100;
output.worldPos = worldPosition.xyz;

return output;
}

问题:当我尝试使用 VertexShader = compile vs_2_0 VertexShaderFunction(); 它只是没有显示任何东西。但如果我只使用 PixelShader 绘制纹理,但感觉有点错误和错位。

4

1 回答 1

2

首先找到有关世界观投影矩阵的任何文档并阅读它。您将了解此矩阵并修复您的代码:

  1. Matrix.CreateLookAt 通过 3 个向量创建一个视图矩阵:位置、目标和向上。如果您将所有这些都作为零向量传递 - 矩阵也将为零。尝试使用 (0, 0, 0) 表示位置,(0, 0, 1) 表示目标, (0, 1, 0) 表示向上。

  2. 对于 2D,您不能使用透视投影。使用 Matrix.CreateOrthographic 或 Matrix.CreatePerspectiveOffCenter(阅读文档中的差异)。您可以在参数中传递您的分辨率,然后您的像素将等于您的世界空间中的一个单位(Matrix.CreateOrthographic(800, 600, -1, 1)。

于 2012-06-21T06:40:24.313 回答