要筛选的世界(忽略Z轴)

时间:2018-12-03 22:21:54

标签: math hlsl

我正在研究一种方法,以加快我目前正在使用我的应用程序进行的某些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以及一个包含视口的WidthHeight的视图缓冲区:

cbuffer ViewBuffer : register(b0) {
    float ViewportWidth;
    float ViewportHeight;
}
cbuffer CameraBuffer : register(b3) {
    float4x4 World;
    float4x4 View;
    float4x4 Projection;
    float4x4 WorldViewProjection;
}

问题

  • 如何在HLSL中从世界转换为屏幕?
  • 在转换过程中如何忽略Z轴。
    • 仅应考虑XY

我相信我的PixelShaderInput结构上将需要一个单独的字段,其中包含转换后的屏幕坐标,以防在2D空间而不是3D空间中渲染对象。这很简单:

struct PixelShaderInput {
    float2 ScreenPosition : SCREEN
    float3 Position : POSITION0;
    //...
};

0 个答案:

没有答案