шейдеры и фильтры текстур - PullRequest
1 голос
/ 02 апреля 2012

Я не настолько опытен с WebGL (думаю, та же проблема может быть переведена в OpenGL). Я рендерил свои объекты, используя вершины и фрагментный шейдер. По сути, все шейдеры получают входной цвет для вершины и просто передают его без изменений до фрагмента, поэтому выполните следующие шаги:

In vertex shader, amongst other things:

attribute vec4 aVertexColor;
varying vec4 vColor;

.................
vColor = aVertexColor;
..................

In shader color:

varying vec4 vColor;

...........
gl_FragColor = vColor;

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

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);

Но, похоже, это не имеет никакого эффекта, даже если я, например, изменю gl.NEAREST на gl.LINEAR, это абсолютно ничего не меняет, насколько я могу судить. Перезаписывает ли шейдер какие-то вещи, и поэтому я не получаю желаемого эффекта? result image

Теперь я прикрепил полученный результат. Теперь я нацеливаюсь на треугольник в трех областях разного цвета (так же, как вершины). Поэтому в моем случае я стремлюсь к ~ 1,3 синему, ~ 1,3 зеленому, ~ 1,3 красному без каких-либо промежуточных цветов. Есть намеки?

Вот что я хочу получить:

Desired result

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

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

Как получить плоский, не интерполированный цвет при использовании вершинных шейдеров

1 голос
/ 02 апреля 2012

То, что вы хотите, я не верю, возможно.Варьирующиеся значения всегда интерполируются, вы не можете переопределить его для использования ближайшего.Для достижения желаемого результата, я думаю, вам нужно будет просто нарисовать 3 полигона по отдельности.

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

...