Какого цвета получает фрагмент, если в одной и той же позиции две вершины с двумя разными цветами? - PullRequest
0 голосов
/ 10 ноября 2010

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

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

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

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

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

Большое спасибо Walter

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

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

0 голосов
/ 10 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...