Подтвердить что ты не робот

Pixel-идеальный шейдер в Unity ShaderLab

В Unity при написании шейдеров

возможно ли, чтобы шейдер "знал", что такое разрешение экрана, и действительно, для шейдера можно управлять отдельными физическими пикселями?

Я думаю только о том, как писать шейдеры для "2D" объектов (например, для использования UI или в любом случае с орто-камерой).

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

Идите за щедростью на этом...

4b9b3361

Ответ 1

Существует встроенное значение ShaderLab, называемое _ScreenParams.

_ScreenParams.x - ширина экрана в пикселях. _ScreenParams.y - высота экрана в пикселях.

Здесь страница документации: http://docs.unity3d.com/462/Documentation/Manual/SL-BuiltinValues.html

Ответ 2

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

Ближе всего вы получите это, если вы визуализируете по рекомендованному разрешению для своего устройства отображения и используете пиксельные шейдеры, чтобы затенять весь экран. Таким образом, один "физический пиксель" будет примерно равен одному фактическому визуализированному пикселю. Помимо этого невозможно связать пиксели физического (то есть вашего дисплея) с отображаемыми.

Это, если, конечно, я как-то неправильно понял ваши намерения.

Ответ 3

возможно ли, чтобы шейдер "знал", что разрешение экрана

Я так не думаю.

и действительно для шейдера для управления отдельными физическими пикселями?

Да. Пиксельные шейдеры знают, какой пиксель они рисуют, а также могут отображать другие пиксели.

Ответ 4

Прежде всего, определите "Pixel perfect" и "Physical pixel".

Если по физическому пикселю вы имеете в виду ваш пиксель дисплея (монитор, дисплей ноутбука, любое другое оборудование, которое вы можете использовать), вам не повезло. Шейдеры не работают с ними, они работают на своих "абстрактных пикселях".

Вы можете думать об этом так:  Ваша графика отображается на изображении с некоторым настраиваемым разрешением (скажем, 800x600 пикселей). Вы все равно можете отображать это изображение на экране 1920x1080 в полноэкранном режиме без проблем, но он выглядел бы дерьмовым. Это то, что происходит с фактическим отображением и видеокартой. Что определяет фактическое количество отображаемых пикселей - это ваш видеорежим (разрешение изображения в приведенном выше примере). А физические пиксели - это пиксели вашего дисплея. При рендеринге вы можете работать только в первом типе.

Это приводит нас к выводу, что при рендеринге графики с тем же разрешением, что и собственное разрешение на экране, вы можете с уверенностью сказать, что вы его передали как "физические пиксели".

В единстве вы можете передать визуализатору некоторые внешние данные (это может включать в себя текущее разрешение экрана (например, в виде Vector2, см. this). Однако вам, скорее всего, этого не нужно, поскольку пиксельные шейдеры уже работают с пикселями (отображаемые пиксели, определенные вашим текущим видеорежимом). Это означает, что если вы используете какое-то разрешение, меньшее, чем ваше собственное, вы, скорее всего, не сможете отобразить один пиксель.

Надеюсь, что это помогло.