/ / Як отримати вершини, завдяки яким у OpenGL ES викликається шейдер фрагмента у OpenGL ES? - opengl-es

Як отримати вершини, через які в OpenGL ES викликається шейдер фрагмента? - opengl-es

Як у OpenGL ES можна отримати вершини, завдяки яким шейдер фрагмента викликається від шейдера фрагмента?

Шейдер фрагмента, який він з'являється, не має посилання на відповідні вершини?

Відповіді:

6 за відповідь № 1

Немає прямого способу доступу до вершин у вашомуфрагмент шейдер і вершина шейдер займається лише 1 вершиною за один раз і не має поняття про цілі примітиви. Шейдер фрагмента має справу лише з фрагментами.

Ви можете виводити інформацію про певну особувершина та її інтерполяція до шейдера фрагмента, як, наприклад, як ви можете поєднувати кольори в трикутник або виконувати координати текстур. Часто вам потрібно буде робити це змішування у фрагменті шейдера так чи інакше, щоб ви могли також зробити це автоматично у вершинній шейдері. Ви можете отримати фрагменти 3-х космічних координат (але лише фрагменти, а не навколишні вершини).

З урахуванням сказаного ви можете приєднати будь-яке довільнеінформацію до ваших шейдерів. Наприклад, крім позиції, нормалів та текстових рядків, ви також можете мати додатковий атрибут, який містить інформацію про кожну вершину, яку ви хочете бути доступною у певній вершині. Якщо може бути 3 набори x, y, z кординатів, якщо це інформація, яку ви хочете, і число, яке вказує, з яким номером вершин у примітиві, яким ви маєте справу (тобто першої 2-ої чи третьої вершини у трикутнику) та / або порядковому номері у цілій сітці. Або це може бути просто індексне число, якщо саме цього ви хочете. Додаткові атрибути займуть більше пам’яті, хоча, як і вам доведеться дублювати дані вершин для кожної вершини в примітиві, щоб гарантувати, що шейдер фрагмента має однакові дані з усіх 3 його вершин.

Наприклад, такі атрибути для кожної вершини (для примітивів трикутника):

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

Якщо вам потрібні нормалі або текстурні шрифти, вам також слід скопіювати це.

Також подумайте, чим ви насправді займаєтесьінформація про вершину у фрагменті шейдера. Замість того, щоб надсилати дані для всіх вершин, чи зможете ви заздалегідь зарахувати відповідь, куди збираєтеся обчислити шейдер фрагмента, і замість цього прикріпити відповідь як атрибут та інтерполювати цей поперек від вершинного шейдера до фрагмента шейдера.

Іншим підходом було б скинути всю вершинудані у формі та перегляньте їх. Ймовірно, вам все одно знадобиться якась інформація про індекс, прикріплена як атрибути вершини, хоча вона знає, на який індекс він повинен шукати. Також пам’ятайте, що пошук буде повільним, оскільки це відбувається з кожним пікселем, і ви, швидше за все, отримаєте зіткнення, оскільки кожна вершина буде переглядати інформацію про оточуючих.

У новіших версіях OpenGL (3.x +) шейдери з геометрії та тесселяції мають доступ до такого роду інформації і можуть виводити її до наступного в шайдерному конвеєрі.

З урахуванням сказаного, це допоможе точно знати, щови намагаєтеся виконати так, як це дає уявлення про те, які вершинні дані потрібно передати в шейдер фрагмента. Також може бути набагато простіший спосіб робити те, що ви хочете, не маючи доступу до цих даних у фрагменті шейдера.


2 для відповіді № 2

Фрагмент шейдера насправді не має зв'язку звершина шейдер, і вершина шейдер є вершиною без поняття загального набору, який створив би цю частину геометрії. Таким чином, ви не можете отримати вершини, що призвели, врешті-решт, до цього примірника фрагмента шейдера.

Чи є певний ефект, який ви намагаєтесядосягти? Що б ви не хотіли обчислити з вершин, зазвичай це можна досягти, завантаживши відповідні зміни - наприклад. якщо ви завантажите 3-е місце розташування кожної вершини до відповідної зміни, то кожен фрагмент по суті буде знати її розташування.