Какой цвет получит фрагмент, если в одном и том же месте находятся две вершины двух разных цветов?

У меня есть вопрос относительно конвейера рендеринга OpenGL.

Недавно я читал теорию о геометрическом шейдере GLSL. Я думаю, что понимаю основы того, как создавать новую геометрию и назначать цвета новым вершинам. Я, однако, не уверен, какой цвет получит фрагмент, если одна из этих новых вершин будет иметь то же положение, что и вершина, поступающая из вершинного шейдера.

Рассмотрим этот пример: насколько я понимаю, я могу обрабатывать одну вершину с помощью вершинного шейдера. Я делаю некоторые преобразования и сохраняю позицию в glPosition. Кроме того, этой вершине можно присвоить цвет, например. сохранив его в glFrontColor. В качестве примера я даю ему красный цвет. Если все каналы имеют 32 бита, это будет 0xFFFFFFFF'00000000'00000000'00000000, верно? Далее задействован шейдер Geometry. Я хочу, чтобы мой геометрический шейдер испускал дополнительные вершины. По крайней мере, одна из них находится в том же положении, что и исходная вершина, полученная от вершинного шейдера. Однако ему назначается другой цвет, например. зеленый. Это будет 0x00000000'FFFFFFFF'00000000'00000000, верно? Рано или поздно, после обработки каждой вершины, происходит растеризация. Как я понимаю, обе вершины растеризованы и поэтому станут одним и тем же фрагментом. Итак, поехали. Какой цвет получит этот конкретный фрагмент? Есть какое-то автоматическое смешивание и фрагмент становится желтым? Или красный или скорее зеленый?

Этот вопрос может быть глупым. Но я просто не понимаю этого и был бы признателен, если бы кто-нибудь разъяснил мне это.

Если нет смешивания (что я предполагаю), как я могу создать эффект смешивания?


person Walter    schedule 10.11.2010    source источник


Ответы (2)


Предполагая, что вы визуализируете точки (что кажется тем, что вы описываете), две вершины с разными цветами приведут к двум фрагментам (по одному для каждой вершины) в одном и том же месте. Какой окончательный цвет будет записан на выходе, зависит от значений Z для каждого, набора функций смешивания и порядка, в котором они обрабатываются (который фактически является случайным — вы не можете рассчитывать ни на один порядок, если не выполните дополнительную синхронизацию). вещи, поэтому вам нужно установить функцию смешивания / Z-выборку так, чтобы это не имело значения).

person Chris Dodd    schedule 10.11.2010

Я думаю, что они будут Z-Fighting, если у них точно такие же значения x y и я.

О смешивании:

Это отдельно от программируемого конвейера, поэтому вам не нужно выполнять для него большую часть работы в шейдерах. Сначала включите смешивание с помощью glEnable(GL_BLEND), затем укажите желаемую функцию смешивания с помощью glBlendFunc, чаще всего glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Теперь вершинам нужно только значение альфа, установленное на gl_FragColor.a, и их цвет будет смешиваться.

person Vincent K    schedule 10.11.2010