我正在研究一种方法,以加快我目前正在使用我的应用程序进行的某些2D绘图。对性能的最大影响是在2D上下文中绘制折线图,并且我了解到将折线图转换为在2D空间中渲染的3D对象将是一个更好的选择。但是,数学使我发疯。我有一种有效的方法可以在我的C#
代码中从世界转换为屏幕,但是在将其转换为HLSL
时遇到问题,它还需要忽略当前方法所在的Z
轴才不是。我不认为简单地将Z
设置为零就足够了。
当前的转换方法是:
public Vector2 GetScreenFromWorld(Vector3 position) {
Matrix worldViewProjection = camera.World * camera.View * camera.Projection;
Vector3 screenPoint;
Viewport.Project(ref position, ref worldViewProjection, out screenPoint);
return screenPoint + 0.5f;
}
这很好用,但是随着摄像机的移动,图表也会移动。我还要指出的是,我的HLSL
中有一个相机缓冲区,其中已经有WorldViewProjection
以及一个包含视口的Width
和Height
的视图缓冲区:
cbuffer ViewBuffer : register(b0) {
float ViewportWidth;
float ViewportHeight;
}
cbuffer CameraBuffer : register(b3) {
float4x4 World;
float4x4 View;
float4x4 Projection;
float4x4 WorldViewProjection;
}
Z
轴。
X
和Y
。我相信我的PixelShaderInput
结构上将需要一个单独的字段,其中包含转换后的屏幕坐标,以防在2D空间而不是3D空间中渲染对象。这很简单:
struct PixelShaderInput {
float2 ScreenPosition : SCREEN
float3 Position : POSITION0;
//...
};