Маленькие Хитрости С Directx И Hlsl

Привет, Хабр! Решил написать статью о маленьких хитростях, которые использую в своем скромном движке.

Это скорее на заметку для себя, и бывалые программисты только усмехнутся, но новичкам, думаю, может быть полезно.



1. Матрицы в HLSL

Допустим, в вершинном шейдере нам нужно повернуть нормаль (касательную, бинормаль) вершины, и у нас есть мировая матрица 4x4. Но нам не нужен сдвиг, зашитый в матрицу.

Затем просто уменьшаем матрицу до 3х3:

  
  
  
  
  
  
   

output.Normal = mul(input.Normal.xyz, (float3x3)RotM);

Кстати, если вам нужно получить обратную матрицу из матрицы вращения 3х3, и при этом она ортогональна, то вам нужно просто ее транспонировать:

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 #Разработка игр

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.