Привет, Хабр! Решил написать статью о маленьких хитростях, которые использую в своем скромном движке.
Это скорее на заметку для себя, и бывалые программисты только усмехнутся, но новичкам, думаю, может быть полезно.
1. Матрицы в HLSL
Допустим, в вершинном шейдере нам нужно повернуть нормаль (касательную, бинормаль) вершины, и у нас есть мировая матрица 4x4. Но нам не нужен сдвиг, зашитый в матрицу.Затем просто уменьшаем матрицу до 3х3:
Кстати, если вам нужно получить обратную матрицу из матрицы вращения 3х3, и при этом она ортогональна, то вам нужно просто ее транспонировать:output.Normal = mul(input.Normal.xyz, (float3x3)RotM);
float3х3 invMat = transpose(Mat);
Либо можно обойтись и без этого, если нужно получить только вектор, преобразованный обратной матрицей — тогда достаточно изменить порядок умножения матрицы и вектора:
float3 outVector = mul((float3x3)RotM, inVector.xyz);
Вы, вероятно, знаете, что для доступа к элементу матрицы вы можете использовать такую запись:
float value = World._m30;
Однако синтаксис позволяет получить сразу несколько значений из матрицы.
Например, получим смещение из матрицы преобразования: float3 objPosition = World._m30_m31_m32;
2. Рендер без буфера вершин
В DX11 есть замечательная возможность отправлять вершины на рендеринг без создания для них буфера вершин.
Код для оболочки C# и SharpDX: System.IntPtr n_IntPtr = new System.IntPtr(0);
device.ImmediateContext.InputAssembler.InputLayout = null;
device.ImmediateContext.InputAssembler.SetVertexBuffers(0, 0, n_IntPtr, n_IntPtr, n_IntPtr);
device.ImmediateContext.InputAssembler.SetIndexBuffer(null, Format.R32_UInt, 0);
device.ImmediateContext.Draw(3, 0);
Здесь мы отправляем три вершины на рендеринг.
А в шейдере, например, из них можно построить полноэкранный квад: struct VertexInput
{
Теги: #hlsl DirectX SharpDX #Разработка игр
-
Как Дешевые Картриджи Помогут Вам В Работе?
19 Oct, 24 -
Забота
19 Oct, 24 -
Был Ли Бухгалтерский Учет?
19 Oct, 24 -
Древесина Фенвика Для Максимума
19 Oct, 24