Войти
ПрограммированиеФорумГрафика

[dx11] GS не работает с DrawIndexedInstanced (2 стр)

Страницы: 1 2
#15
21:42, 17 июля 2019

Да, я не понял.

А считать нужно только для одного треугольника или множества ?


#16
22:23, 17 июля 2019

innuendo
Код дизассемблированный (модифицирую игру), поэтому чтоб мозги не ломать стараюсь не давать лишнего. Вот например начало вертексного шейдера, где инстанс юзается:

void  VS_C5E5DA12_AB632422_C(
  float4 v0 : POSITION0,
  float2 v1 : TEXCOORD0,
  float4 v2 : COLOR0,
  uint v3 : SV_InstanceID0,
  out float4 o0 : SV_POSITION0,
  out float4 o1 : TEXCOORD0,
  out float4 o2 : COLOR0,
  out float4 o3 : COLOR1,
  out float2 o4 : TEXCOORD5,
  out float4 o5 : TEXCOORD6,
  out float4 o6 : TEXCOORD7,
  out uint o7 : EYEIDX0,
  out float o8 : SV_ClipDistance0,
  out float p8 : SV_CullDistance0)
{
  float4  r0,r1,r2,r3,r4,r5;

  r0.x = (int)v3.x & 1; //SV_InstanceID0
  r0.x = (float)r0.x;
  r0.x = r0.x * cb6[0].y;
  r0.x = (uint)r0.x;
  o7.x = r0.x; //EYEIDX0
  r0.y = int(r0.x) * 3;
  r0.z = int(r0.x) << 2;
  r1 = cb3[r0.z + 16].x * cb2[r0.y + 0];
  r2 = cb3[r0.z + 16].y * cb2[r0.y + 1];
//..............
}

Вот полный геометрический

[maxvertexcount(3)]
void  GS_C5E5DA12_AB632422_C(
  triangle GS_OUTPUT_AB632422 input[3],
  inout TriangleStream<GS_OUTPUT_AB632422> OutputStream)
{
  GS_OUTPUT_AB632422  output=(GS_OUTPUT_AB632422)0;

  float  triarea=length(cross(input[1].v6.xyz - input[0].v6.xyz, input[2].v6.xyz - input[0].v6.xyz));
  triarea*=0.5;

  float  areafactor=saturate(triarea*(1.0/1000.0) - 1.0);
  areafactor=max(areafactor, 0.05);
  triarea=saturate(triarea*(1.0/12000.0));

  for (uint i=0; i<3; i++)
  {
    output.v0 = input[i].v0;
    output.v1 = input[i].v1;
    output.v2 = input[i].v2;
    output.v3 = input[i].v3;
    output.v4 = input[i].v4;
    output.v5 = input[i].v5;
    output.v6 = triarea;
    output.o7 = input[i].o7;
    output.o8 = input[i].o8;
    output.p8 = input[i].p8;

    OutputStream.Append(output);
  }

  OutputStream.RestartStrip();
}

Ну и в пиксельном те же аргументы на входе

void  PS_C5E5DA12_AB632422_C(
  float4 vPos : SV_POSITION0,
  float4 v1 : TEXCOORD0,
  float4 v2 : COLOR0,
  float4 v3 : COLOR1,
  float2 v4 : TEXCOORD5,
  float4 v5 : TEXCOORD6,
  float4 v6 : TEXCOORD7,
  uint v7 : EYEIDX0,
  float v8 : SV_ClipDistance0,
  float w8 : SV_CullDistance0,
  out float4 o0 : SV_Target0)

Фактически беру спрайты частиц, ореолы свечей, например, нахожу центры, травлю нормаль и альбедо, смещаю в сторону камеры и получаю из них источник света деферный. Но даже без шкалирования и смещения с весьма порезанными шейдерами до оригинальных, не работает в VR при подключении gs. Т.е. если просто его выключить, реальный объект абсолютно так же отображается, как и с включенным gs, за исключением копий криво плавающих по обе стороны. Вот визуализация с gs включенным и голову поворачиваю
Изображение
Изображение
Т.е. почему-то не клипается пополам.

bykabak
Считать для всех рисуемых. Скорость точно не проблема.

#17
22:38, 17 июля 2019

А почему должно "клипаться" пополам ?

#18
22:46, 17 июля 2019

bykabak
Остальные объекты же клипаются, чтоб не попадать в другой глаз.

#19
23:22, 17 июля 2019

Да, но они же не обрабатываются в GS.  Или я опять не понял ?

#20
23:23, 17 июля 2019

BorisV
> r0.x = (int)v3.x & 1; //SV_InstanceID0
> r0.x = (float)r0.x;
> r0.x = r0.x * cb6[0].y;
> r0.x = (uint)r0.x;
> o7.x = r0.x; //EYEIDX0
Я вот вижу, что перед атупутом "глаза" в o7 ты умножаешь это значение на что-то из констатного буфера cb6[0].y. Проверял что у тебя там хранится?

#21
0:13, 18 июля 2019

bykabak
Да, верно, они без геометрических шейдеров. Но мне надо использовать геометрический шейдер, сохранив клиппинг. Без понятия как, ибо с геометрическими шейдерами очень редко сталкивался и не знаю их экзотики.

MrShoor
Без понятия, что там игра выдает, просто подменяю шейдер. Но данные правильные, потому что без gs корректно выводится на оба глаза и шейдер тупо реверснутый в hlsl.

#22
(Правка: 1:06) 1:05, 18 июля 2019

BorisV
Код геометрического шейдера вполне нормальный. Не вижу ничего криминального в нем.
Либо ошибка где-то еще, либо могу посоветовать избавится от built-in семантик в вертексном. Попробуй сделать, чтобы вершинный шейдер возвращал:

void  VS_C5E5DA12_AB632422_C(
  float4 v0 : POSITION0,
  float2 v1 : TEXCOORD0,
  float4 v2 : COLOR0,
  uint v3 : SV_InstanceID0,
  out float4 o0 : COLOR2,
  out float4 o1 : TEXCOORD0,
  out float4 o2 : COLOR0,
  out float4 o3 : COLOR1,
  out float2 o4 : TEXCOORD5,
  out float4 o5 : TEXCOORD6,
  out float4 o6 : TEXCOORD7,
  out uint o7 : EYEIDX0,
  out float o8 : COLOR3,
  out float p8 : COLOR4)
{
То есть я просто убрал SV_Position/SV_ClipDistance0/SV_CullDistance0 семантики заменив их на COLOR.
Геометрический тоже измени на:
struct VS_OUTPUT_AB632422
{
  float4 v0 : COLOR2;
  float4 v1 : TEXCOORD0;
  float4 v2 : COLOR0;
  float4 v3 : COLOR1;
  float2 v4 : TEXCOORD5;
  float4 v5 : TEXCOORD6;
  float4 v6 : TEXCOORD7;
  uint o7 : EYEIDX0;
  float o8 : COLOR3;
  float p8 : COLOR4;
};

struct GS_OUTPUT_AB632422
{
  float4 v0 : SV_Position;
  float4 v1 : TEXCOORD0;
  float4 v2 : COLOR0;
  float4 v3 : COLOR1;
  float2 v4 : TEXCOORD5;
  float4 v5 : TEXCOORD6;
  float4 v6 : TEXCOORD7;
  uint o7 : EYEIDX0;
  float o8 : SV_ClipDistance0;
  float p8 : SV_CullDistance0;
};

[maxvertexcount(3)]
void  GS_C5E5DA12_AB632422_C(
  triangle VS_OUTPUT_AB632422 input[3],
  inout TriangleStream<GS_OUTPUT_AB632422> OutputStream)
{
  GS_OUTPUT_AB632422  output=(GS_OUTPUT_AB632422)0;

  float  triarea=length(cross(input[1].v6.xyz - input[0].v6.xyz, input[2].v6.xyz - input[0].v6.xyz));
  triarea*=0.5;

  float  areafactor=saturate(triarea*(1.0/1000.0) - 1.0);
  areafactor=max(areafactor, 0.05);
  triarea=saturate(triarea*(1.0/12000.0));

  for (uint i=0; i<3; i++)
  {
    output.v0 = input[i].v0;
    output.v1 = input[i].v1;
    output.v2 = input[i].v2;
    output.v3 = input[i].v3;
    output.v4 = input[i].v4;
    output.v5 = input[i].v5;
    output.v6 = triarea;
    output.o7 = input[i].o7;
    output.o8 = input[i].o8;
    output.p8 = input[i].p8;

    OutputStream.Append(output);
  }

  OutputStream.RestartStrip();
}
Возможно проблема уйдет. Я напарывался на подобное, когда пытался протащить SV_InstanceID вот так внаглую. Возможно тут тот же случай, GS просто не хочет читать из SV_Position/SV_ClipDistance0/SV_CullDistance0. И не смотри, что в msdn написано, что читать можно во всех шейдерах кроме вертексного. Для SV_InstanceID вон тоже написано, что доступна везде, но по факту читать из неё можно только в вершинном шейдере.
#23
1:27, 18 июля 2019

MrShoor
Спасибо большое, попробую утром.

#24
14:22, 18 июля 2019

MrShoor
Еще раз спасибо, помогло на входе gs
float o8 : COLOR3;//SV_ClipDistance;
float p8 : COLOR4;//SV_CullDistance;

#25
15:16, 18 июля 2019

У меня тоже был глюк с симантиками - не создавался Layout, если одну из симантик называл "COLOR". Переименовал и Layout создаётся :) , но день убил.

#26
19:28, 18 июля 2019

bykabak
С таким изуродованным MSDN, ничего удивительного, что странные баги ловятся.

#27
22:22, 18 июля 2019

MrShoor
> Для SV_InstanceID вон тоже написано, что доступна везде, но по факту читать из
> неё можно только в вершинном шейдере.
да, действительно это так, им надо баг на доки написать.
BorisV
Кстати, а SV_GSInstanceID это не поможет?

#28
22:42, 18 июля 2019

Andrey
> да, действительно это так, им надо баг на доки написать.
У них есть в доках такое описание:

Other system values (SV_VertexID, SV_InstanceID, SV_IsFrontFace) can only be input into the first active shader in the pipeline that can interpret the particular value; after that the shader function must pass the values to subsequent stages.

Но оно там, куда никто не смотрит, а в таблице у них тупо:
Per-instance identifier automatically generated by the runtime (see Using System-Generated Values (Direct3D 10)). Available to all shaders.
Страницы: 1 2
ПрограммированиеФорумГрафика