2012-11-30 5 views
1

Итак, у меня есть коллекция объектов, которые я создал в openGL. Каждый из них имеет свои собственные цвета, а некоторые из них имеют текстуры, применяемые к ним. То, что я хочу сделать, - остановить определенные цвета от доступа к экрану, но все же иметь возможность изменить его. Есть ли способ вишневого выбора, какие цвета на самом деле нарисованы?Создание цветного экрана в OpenGL

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

В идеале, это то, как он будет работать:

красный объект + красный экран = красный объект

синий объект + красный экран = серый/черный/белый объект

фиолетовый объект + красный экран = красный объект

-EDIT-

Чтобы прояснить, что я пытаюсь сделать это: я хочу оставить значения RGB для всех моих объектов одинаковыми. Однако, прежде чем они будут нарисованы на экране, я хочу «обнулить» некоторые значения цвета, не внося никаких реальных изменений в объект.

Таким образом, объект с RGB [255,150,200], проходящий через красный фильтр, будет окрашен, как если бы он имел значение RGB [255,0,0], зеленый фильтр [0,150,0] и синий фильтр [0 , 0200].

+0

Описание для 'как это будет работать ...' кажется довольно расплывчатым.Можете ли вы выразить это как функцию, например, источника и адресата RGB (A)? –

+0

Я редактировал вопрос с некоторыми примерами значений RGB. Надеюсь, это поможет объяснить мой вопрос. –

+0

Это должно быть довольно простой задачей для фрагментарного шейдера. – jaho

ответ

1

Вы ищете glColorMask?

Смотрите этот ответ: Render into a color channels without affecting other channels

Я не ясно вашей проблемы, но это будет маскировать/в отдельных цветовых каналов: R, G, B или А


Учитывая это

Таким образом, объект с RGB [255,150,200], проходящий через красный фильтр, будет окрашен, как если бы он имел значение RGB [255,0,0], зеленый фильтр [0,150,0] и синий фильтр [ 0,0,200]

glColorMask будет работать.

glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); 
drawMyRedFilteredStuff(); 
// Return open gl state back to normal function 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 

Если вам нужно только фильтровать красный, зеленый, синий или альфа, то это именно то, что вы ищете.

Я все еще не понимаю, что вы пытаетесь сделать?

+0

Пока эффект glColorMask дает классно, это не совсем то, что я хочу. Это просто запрет редактирования некоторых цветовых каналов до тех пор, пока они не будут включены. Мне нужно, чтобы остановить opengl, чтобы не помещать определенные цвета на экран. Мне нужно _eliminate_ двух компонентов RGB любого количества объектов в моей сцене ... –

0

Я думаю, что это было бы лучше всего обработать фрагментарным шейдером. Если «фильтр» является постоянной величиной, вы можете установить его в качестве формы, например,

uniform vec3 filter_rgb; 
in vec3 src_rgb; 

out vec4 dst_rgba; 

void main (void) 
{ 
    dst_rgba = vec4(min(filter_rgb, src_rgb), 1.0); 
} 

Так, если какие-либо из компонентов фильтра устанавливается в нуль, то соответствующий компонентный выход будет равен нуль, также. В зависимости от вашего поведения функция clamp может быть более полезным выбором встроенной функции min.

+0

Из того, что я понимаю о шейдерах, я уверен, что это то, что мне нужно. Как вы думаете, вы могли бы указать мне (или дать мне сами) объяснение того, как реализовать что-то подобное в теле программы? Например, если бы я хотел, чтобы фильтр _only_ рисовал красный компонент фрагмента, что бы я сделал с вашим примером? –

Смежные вопросы