Смешивание металла с тем же альфа

Я рисую три квадрата, как на рисунке  введите описание изображения здесь

Я добавляю красный цвет с альфа 0.2.

В перекрывающихся областях я также хочу, чтобы области были с альфой 0,2. Теперь он идет как 0,6. Как я могу это подсказать. В настоящее время мой дескриптор конвейера

 pipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
 pipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
 pipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
 pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .one
 pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .one
 pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
 pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

Мне нужно сделать это в дескрипторе конвейера или в шейдере?


person Ruban4Axis    schedule 08.08.2018    source источник
comment
Вам нужно четко представлять, что именно вы хотите, что вы получаете и чем они отличаются. Я думал, что ваш вопрос ясен, но обсуждение в комментариях к ответу Abix вызывает у меня сомнения. Попробуйте опубликовать снимок экрана с тем, что вы получаете, и, если возможно, изображение того, что вы хотите (макет или результаты OpenGL, если они у вас есть).   -  person Ken Thomases    schedule 08.08.2018
comment
@KenThomases Need - когда палец касается экрана, я рисую три прямоугольника с помощью Touch Point. Они перекрывают прямоугольники, как показано на рисунке выше. Мне нужно нарисовать их с альфой 0,2. В перекрывающихся местах сейчас альфа 0,4. Во втором касании он может добавить, если первое касание и второе касание перекрываются. В противном случае альфа должна быть 0,2.   -  person Ruban4Axis    schedule 09.08.2018
comment
@KenThomases stackoverflow.com/questions/51741792/   -  person Ruban4Axis    schedule 09.08.2018


Ответы (1)


Если вы хотите, чтобы конечный результат имел ту же альфу, что и вы рисуете, вам нужно установить их как:

 pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .one
 pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .zero

Это будет означать, что финальная альфа-версия не будет иметь никакого отношения к цели, на которой вы выполняете рендеринг.

person Abix    schedule 08.08.2018
comment
Это не работает. Для справки я добавил код. github.com/PIRANAVARUBAN/Blend - person Ruban4Axis; 08.08.2018
comment
Из вашего кода мне кажется, что вы пытаетесь многократно рисовать прямоугольники на мишени с равномерной прозрачностью. Кажется, что для каждого касания вы хотите, чтобы цвет прямоугольников имел одинаковое значение. Но в настоящее время он становится все более красным с каждым розыгрышем. Это правильно? - person Abix; 08.08.2018
comment
Одним касанием из этой точки я рисую три прямоугольника. Если эти три прямоугольника в одной альфа-версии меня устраивают. Если следующее прикосновение накладывается. Если добавляет, все в порядке. - person Ruban4Axis; 08.08.2018
comment
Что ж, в этом случае смешение альфы не имеет значения. Альфа назначения не имеет значения. Одним из способов добиться этого может быть составление примитивов треугольника на касание таким образом, чтобы они не перекрывались. Таким образом, при однократном прикосновении цвет не добавлялся. Но для прикосновения внахлест это было бы. Но для этого вам потребуется много изменений кода (чтобы расположить неперекрывающиеся треугольники, чтобы получилась одна и та же форма). - person Abix; 08.08.2018
comment
Нельзя ли сделать что-нибудь в шейдере, чтобы перекрывающиеся области получали постоянный альфа-канал? - person Ruban4Axis; 08.08.2018
comment
Если вас устраивает то, что все прямоугольники (не только три на касание) имеют одинаковый оттенок красного, то вы можете сохранить копию холста (целевая текстура, которая в этом примере чисто белая) и передать ее фрагменту шейдер. Во фрагментном шейдере смешайте пиксели, выбранные с этого холста, с красным цветом с весом 0,2. Отключите все вместе в дескрипторе конвейера. Но цвета тогда никогда не прибавятся. Если это нормально. - person Abix; 08.08.2018
comment
Как это сделать, пожалуйста, Ellaborate? - person Ruban4Axis; 08.08.2018
comment
Например, если ваш холст является изображением, создайте текстуру Металла из изображения. Теперь в вашем фрагментном шейдере возьмите эту текстуру в качестве входных данных. В том же фрагментном шейдере теперь получаем пиксель текстуры (float4 canvasColor = canvasTexture.sample (defaultSampler, params.textureCoordinates)). Затем смешайте этот цвет с цветом вашего рисунка (float4 finalColor = mix (canvasColor, brushColor, 0.2);), а затем верните это значение из вашего фрагментного шейдера. Отключите смешивание дескриптора конвейера рендеринга. Это должно нарисовать все прямоугольники с равномерной прозрачностью 0,2. - person Abix; 08.08.2018