Я работаю над тем, чтобы ускорить некоторые 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;
//...
};