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

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

Страницы: 1 2 Следующая »
#0
(Правка: 18 июля 2019, 14:23) 16:02, 17 июля 2019

EDIT: пофиксено, благодарю за помощь.

Игра рендерит через инстанс объекты по левую и правую стороны render target функцией DrawIndexedInstanced (vr). Проблема в том, что хочу прицепить геометрический шейдер, чтоб посчитать площадь треугольника, но даже простой без изменений данных, глючит. Если смотреть прямо на объект, то он виден корректно по обе стороны, а если поворачивать голову, то появляется в одной или другой стороне "плавающая" копия, как будто инстансовая копия рисуется не туда. Чисто с вертексным и пиксельным шейдером работает правильно. Подскажите пожалуйста, как правильно написать геометрический шейдер для такого случая, чтоб просто передать данные уже сгенеренной информации инстанса в вертексном шейдере? Я в них не шарю, пару штук понадобилось за всю жизнь.

struct GS_OUTPUT
{
  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 GS_OUTPUT input[3],
  inout TriangleStream<GS_OUTPUT> OutputStream)
{
  GS_OUTPUT  output=(GS_OUTPUT)0;

  //output
  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 = input[i].v6;
    output.o7 = input[i].o7;
    output.o8 = input[i].o8;
    output.p8 = input[i].p8;

    OutputStream.Append(output);
  }

  OutputStream.RestartStrip();
}


#1
16:55, 17 июля 2019

GS для добавления или удаления примитивов, по-моему, а не расчёта площади...

#2
16:58, 17 июля 2019

model space ?

#3
17:09, 17 июля 2019

innuendo
Экранное. Вообще все работает как надо без стерео (ну без инстанса то бишь), только вот как адаптировать, не понимаю. Всего лишь надо чтоб геометрический шейдер выдавал то, что и получает, кроме одной переменной.

bykabak
Вы мне предложите считать площадь триангла на цпу?

#4
18:31, 17 июля 2019

Да нет, а чем VS не угодил ?

#5
19:21, 17 июля 2019

BorisV
>Если смотреть прямо на объект, то он >виден корректно по обе стороны, а если >поворачивать голову, то появляется в >одной или другой стороне "плавающая" >копия, как будто инстансовая копия >рисуется не туда.
геметрический шейдер не получает данные с учетом инстанс информации?. может нужно сделать это также как в вершинном шейдере, продублировав код? как передаещь? отдельным буфером или SV_InstanceID?

#6
(Правка: 19:27) 19:22, 17 июля 2019

bykabak
Честно говоря, не знаю как посчитать в вертексном шейдере площадь треугольника на экране (или хоть что-то эквивалентное), не имея данных о позициях соседних вершин. Заморочки с генерацией дополнительных вертексных данных требуют больше переделок в коде.

Andrey
Геометрический шейдер получает данные инстанса, потому что сам объект рисуется правильно в оба глаза шлема. Вертексный шейдер вообще не меняю, он использует SV_InstanceID и соответственно все output переменные вертексного шейдера подаются на вход/выход геометрического и потом на вход пиксельного.

#7
19:49, 17 июля 2019

BorisV,
Как же это - не имея ?

А что передаётся в VS по-вашему ?  -Именно позиции каждого вертекса от каждого Instance в том числе.

#8
19:51, 17 июля 2019

bykabak
Для площади надо позиции двух соседних вертексов, а они не передаются в vs.

#9
(Правка: 19:55) 19:53, 17 июля 2019

Соседних вертексов вообще - разных объектов или какого-то Instance, или одного объекта ?

#10
20:27, 17 июля 2019

bykabak
Просто соседние вертексы, образующие треугольник. Нужно для пиксельного шейдера.

#11
(Правка: 20:57) 20:38, 17 июля 2019

Вертексы образующие треугольник всегда передаются в VS.

Или вы хотите добавить вертексы - треугольник в GS и посчетать площадь получившегося нового треугольника ?

#12
21:26, 17 июля 2019

BorisV

а без инстансинга работает ?

#13
(Правка: 21:33) 21:32, 17 июля 2019

bykabak
Спасибо за помощь, но вы не поняли суть моей задачи, она не выполнима через vs, потому что он оперирует только с одной вершиной и не имеет доступа к другим. Мне просто надо портировать для стерео через инстансинг, но почему-то глючит.

innuendo
Да, работает.

#14
21:37, 17 июля 2019

BorisV

приводи весь код уже

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика