Геометричен шейдър, MaxVertexCount не може да бъде известен

В момента работя върху шейдър, където броят на върховете не се определя от броя на триъгълниците, моят шейдър поставя куб на всеки X единици.

Това означава, че не мога да знам предварително колко кубчета ще създаде и не знам много върхове, които ще вземе.

Въпреки това трябва да поставите maxvertexcount[x]. Какво да сложа в x?

Как да заобиколя това?

Забележка: Аз съм начинаещ в геометричните шейдъри и не знам почти нищо за тях.


person Subject009    schedule 06.06.2014    source източник


Отговори (1)


Вие правите знаете колко върха ще отнеме („взема“ като вход) на извикване.

Това се определя от примитивната топология; триъгълник (лента), например, отнема 3, а съседството на триъгълник отнема 6. MaxVertexCount абсолютно трябва да се знае, защото има ограничение за изпълнение на броя на върховете, които можете да изведете на извикване.

Ако достигнете това ограничение при еднократно извикване, тогава ще трябва да принудите GPU да извика вашия Geometry Shader няколко пъти (функция Shader Model 5.0). D3D нарича този процес като < em>"Инстанциране на Geometry Shader" и дава uint InstanceID : SV_GSInstanceID за идентифициране кое дублирано извикване (екземпляр) се изпълнява.

Вашето описание на проблема всъщност затруднява окончателния отговор, можете ли да включите някакъв HLSL код, за да покажете какво всъщност се опитвате да направите?

person Andon M. Coleman    schedule 07.06.2014
comment
Опитвам се да превърна сграда в тухли, за да мога постепенно да я изградя. така че 1 триъгълник -› множество (количество в зависимост от размера на триъгълника) тухли. Maxvertexcount не е ли числото, което извеждаш? Ако това е входът, тогава е само 3 (с помощта на trianglelist). - person Subject009; 07.06.2014
comment
Да, но вие говорехте за върхове, взети в част от вашия въпрос. За мен това предполага въвеждане. Нещо като консумирано срещу произведено нещо. Maxvertexcount е максималният брой върхове, които едно извикване може да изведе, вие сте свободни да изведете само 3 върха, ако желаете, ако извеждате триъгълници. Но има горна граница за броя на върховете, които можете да изведете в едно извикване, както споменах. Обикновено е от порядъка на 256 или така; това означава, че едно извикване на вашия GS може да изведе до 85 триъгълника, ако използвате MaxVertexCount = 256. - person Andon M. Coleman; 07.06.2014
comment
Причината, поради която не можете просто да зададете максималния брой върхове на 256 и да забравите за него, е, че D3D използва тази информация, за да подобри ефективността на паралелното изпълнение. GS изходите трябва да запазят реда на изпълнение, за да може чертането да работи правилно, така че това означава, че всеки GS трябва да резервира n-много върхове в кеш буфер след трансформация. Ако зададете тази стойност твърде висока, ще навредите на ефективността на вашия GS кеш. Честно казано, това не е огромен проблем на модерния хардуер DX11, те имат големи кеш памети, но когато геометричните шейдъри се появиха за първи път (DX10), това беше сериозен проблем. - person Andon M. Coleman; 07.06.2014
comment
Виждам, но тогава проблемът ми все още остава, ако това е наистина голям триъгълник, може да се наложи да изведа 2056 върха или дори повече и ако задам толкова високо число, това дава грешка. - person Subject009; 07.06.2014
comment
Правилно, не можете да изведете повече от 256 върха в едно извикване. Имате нужда от GS инстанция, за да можете да направите това. D3D11 гарантира до 32 екземпляра, така че това ще ви позволи да изведете 8192 върха или 2730 триъгълника, като стартирате вашия GS 32 пъти. - person Andon M. Coleman; 07.06.2014
comment
Добре, но аз съм начинаещ, така че... Как да пусна моя GS няколко пъти? - person Subject009; 07.06.2014
comment
@Subject009 : подразделянето е работа, която е по-предназначена за теселационен шейдър, геометричният шейдър не е толкова ефективен за този тип задачи. - person mrvux; 08.06.2014