/ / Ako získať vrcholy, kvôli ktorým sa v OpenGL ES nazýva fragment shader? - opengl-es

Ako získať vrcholy, kvôli ktorým sa v OpenGL ES nazýva fragment shader? - opengl-es

V OpenGL ES, ako môžem získať vrcholy, kvôli ktorým sa nazýva fragment shader z fragmentu shaderu?

Zdá sa, že fragmentový shader nemá žiadny odkaz na korešpondujúce vrcholy?

odpovede:

6 pre odpoveď č. 1

Neexistuje žiadny priamy spôsob prístupu k vrcholom vo vašomfragment shader a vrcholový shader sa zaoberá iba jedným vrcholom naraz a nemá koncepciu všetkých primitivov. Fragment shader sa zaoberá iba fragmentami.

Môžete zobraziť informácie o konkrétnomvertex a nechajte ho interpolovať do fragmentu shaderu ako to, ako môžete zmiešať farby cez trojuholník alebo urobiť textúru súradníc. Často budete musieť urobiť, že miešanie v fragmentu shader rovnako tak môžete mať tak urobil automaticky v vertex shader. Môžete získať fragmenty 3D priestorových súradníc (ale len fragmenty, nie okolité vrcholy).

S tým môžete povedať, že môžete pripojiť nejaké ľubovoľnéinformácie pre vaše shadery. Napríklad okrem pozície, normálov a texcoordov by ste mohli mať aj extra atribút, ktorý má informácie o každom vrchole, ktorý chcete byť prístupný v určitom vrchole. Ak by mohli byť 3 sady x, y, z súradníc, ak ide o informácie, ktoré chcete, a číslo udávajúce číslo vertexu v primitívnom prvku (tj prvý 2. alebo 3. vrchol v trojuholníku) a / alebo poradové číslo v celej sieti. Alebo to môže byť jednoduché indexové číslo, ak to je to, čo chcete. Extra atribúty by vyžadovali väčšiu pamäť, pretože by ste museli duplikovať vertexové dáta pre každý vrchol v primitívnom prvku, aby ste zabezpečili, že fragment shader má rovnaké údaje zo všetkých 3 vrcholov.

Napríklad nasledujúce atribúty pre každý vrchol (pre triangle primitives):

v1, n1, uv1, v1, v2, v3, 0
v2, n2, uv2, v1, v2, v3, 1
v3, n3, uv3, v1, v2, v3, 2
v4, n4, uv4, v4, v5, v6, 0
v5, n5, uv5, v4, v5, v6, 1
v6, n6, uv6, v4, v5, v6, 2

Ak potrebujete normály alebo textúry, potrebujete to aj duplikovať.

Takisto zvážte, s čím v skutočnosti ideteinformácie o vrchole v šablóne fragmentov. Namiesto odosielania údajov pre všetky vrcholy, môžete predbežne vypočítať odpoveď, kde sa chystáte vypočítať v šablóne fragmentov, a namiesto toho priložiť odpoveď ako atribút a interpolovať ju naprieč od vrcholu shaderu k fragmentu shaderu.

Ďalším prístupom by bolo vyskladnenie všetkých vrcholovúdaje v uniforme a vyhľadajte ju. Pravdepodobne by ste ešte potrebovali nejakú informáciu o indexoch pripojenú ako atribúty vertexu, aj keď vie, aký index by mal vyhľadávať. Nezabudnite, že vyhľadávanie bude pomalé, pretože sa deje každý pixel a pravdepodobne budete mať kolízie, pretože každý vrchol sa bude pozerať na informácie o tých, ktoré ho obklopujú.

V novších verziách OpenGL (3.x +) geometria a tessellation shaders majú prístup k tomuto druhu informácií a môžu ich výstup na ďalšiu vec v shader pipeline.

S tým povedal, že by pomohol presne vedieť, čoktoré sa pokúšate dosiahnuť, pretože poskytuje predstavu o tom, aké verterové dáta musia byť odovzdané do fragmentu shaderu. Môže tiež existovať oveľa jednoduchší spôsob, ako robiť to, čo chcete, bez toho, aby ste mali prístup k týmto údajom v šablóne fragmentov.


2 pre odpoveď č. 2

Fragment shader skutočne nemá žiadny odkaz navertex shader a vertex shader je per-vertex bez koncepcie celkovej množiny, ktorá vytvorila tento geometrický útvar. Takže nemôžete získať vrcholy, ktoré nakoniec vyústili do tejto inštancie fragmentového shaderu.

Existuje konkrétny efekt, ktorý sa snažítedosiahnuť? Čokoľvek je to, čo chcete vypočítať z vrcholov, je zvyčajne dosiahnuteľné zavedením vhodných variácií - napr. ak načítate polohu 3D každého vrcholu na vhodnú premennú, potom každý fragment bude vedieť, ako je jeho umiestnenie.