Мир на экран (игнорируя ось Z) - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю над тем, чтобы ускорить некоторые 2D-чертежи, которые я сейчас делаю с моим приложением.Самый большой удар по производительности - это рендеринг линейной диаграммы с 2D-контекстом, и я узнал, что преобразование этой линейной диаграммы в 3D-объект, визуализированный в 2D-пространстве, было бы лучшим вариантом.Тем не менее, математика сводит меня с ума.У меня есть рабочий метод для преобразования из мира в экран в моем 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;
}

Вопросы

  • Как мне конвертировать из мира в экран в HLSL?
  • Как игнорировать ось Z во время конвертации.
    • Следует учитывать только X и Y.

Я считаю, что мне понадобится отдельное поле в моей структуре PixelShaderInput, которая содержитпреобразованные экранные координаты в случае, если объект должен быть представлен в 2D пространстве вместо 3D.Это было бы просто:

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