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(); }
GS для добавления или удаления примитивов, по-моему, а не расчёта площади...
model space ?
innuendo
Экранное. Вообще все работает как надо без стерео (ну без инстанса то бишь), только вот как адаптировать, не понимаю. Всего лишь надо чтоб геометрический шейдер выдавал то, что и получает, кроме одной переменной.
bykabak
Вы мне предложите считать площадь триангла на цпу?
Да нет, а чем VS не угодил ?
BorisV
>Если смотреть прямо на объект, то он >виден корректно по обе стороны, а если >поворачивать голову, то появляется в >одной или другой стороне "плавающая" >копия, как будто инстансовая копия >рисуется не туда.
геметрический шейдер не получает данные с учетом инстанс информации?. может нужно сделать это также как в вершинном шейдере, продублировав код? как передаещь? отдельным буфером или SV_InstanceID?
bykabak
Честно говоря, не знаю как посчитать в вертексном шейдере площадь треугольника на экране (или хоть что-то эквивалентное), не имея данных о позициях соседних вершин. Заморочки с генерацией дополнительных вертексных данных требуют больше переделок в коде.
Andrey
Геометрический шейдер получает данные инстанса, потому что сам объект рисуется правильно в оба глаза шлема. Вертексный шейдер вообще не меняю, он использует SV_InstanceID и соответственно все output переменные вертексного шейдера подаются на вход/выход геометрического и потом на вход пиксельного.
BorisV,
Как же это - не имея ?
А что передаётся в VS по-вашему ? -Именно позиции каждого вертекса от каждого Instance в том числе.
bykabak
Для площади надо позиции двух соседних вертексов, а они не передаются в vs.
Соседних вертексов вообще - разных объектов или какого-то Instance, или одного объекта ?
bykabak
Просто соседние вертексы, образующие треугольник. Нужно для пиксельного шейдера.
Вертексы образующие треугольник всегда передаются в VS.
Или вы хотите добавить вертексы - треугольник в GS и посчетать площадь получившегося нового треугольника ?
BorisV
а без инстансинга работает ?
bykabak
Спасибо за помощь, но вы не поняли суть моей задачи, она не выполнима через vs, потому что он оперирует только с одной вершиной и не имеет доступа к другим. Мне просто надо портировать для стерео через инстансинг, но почему-то глючит.
innuendo
Да, работает.
BorisV
приводи весь код уже
Тема в архиве.