Unity ShaderLab中的像素完美着色器

时间:2016-01-22 17:03:50

标签: unity3d shader pixel

在Unity中,在编写着色器时,

着色器本身是否可以“知道”屏幕分辨率是什么,实际上是着色器控制单个物理像素?

我只考虑为“2D”对象编写着色器的情况(例如用于UI使用,或者在使用正交相机的任何事件中)。

(当然,通常在屏幕上显示一个物理像素完美的PNG,你只需要一个400像素的PNG,你就可以安排缩放,使着色器正好相当于400个物理像素。我是什么我想知道的是一个只是绘制的着色器,例如物理像素完美的黑线 - 它必须“知道”物理像素的确切位置。)

为此获得赏金......

4 个答案:

答案 0 :(得分:6)

有一个名为_ScreenParams的ShaderLab内置值。

_ScreenParams.x是屏幕宽度(以像素为单位)。 _ScreenParams.y是屏幕高度,以像素为单位。

这是文档页面:http://docs.unity3d.com/462/Documentation/Manual/SL-BuiltinValues.html

答案 1 :(得分:5)

我认为这不会发生。您的渲染与当前所选的视频模式相关联,甚至不必与您的物理屏幕尺寸相匹配(如果这是您完全按像素划分的意思)。

您最接近的是如果您按照建议的分辨率渲染显示设备并使用像素着色器遮挡整个屏幕。这样,一个“物理像素”将大致等于一个实际渲染像素。除此之外,不可能将物理(即显示器)像素与渲染像素相关联。

当然,除非我以某种方式误解了你的意图。

答案 2 :(得分:4)

  

着色器本身是否可以“知道”屏幕分辨率是什么

我不这么认为。

  

实际上对于着色器来控制单个物理像素?

是。像素着色器知道它们正在绘制的像素,也可以采样其他像素。

答案 3 :(得分:2)

首先,请定义'Pixel perfect'和'Physical pixel'。

如果按物理像素表示显示器的像素(显示器,笔记本电脑显示器,您可能使用的任何其他硬件),那么您就不走运了。着色器不会对它们进行操作,它们使用自己的“抽象像素”进行操作。

您可以这样思考:  您的图形以具有一些可配置分辨率(例如800x600像素)的图片呈现。您仍然可以在全屏幕上以1920x1080显示屏显示此图片没问题,但它看起来很糟糕。这就是实际显示和视频卡渲染所发生的事情。决定渲染像素实际数量的因素是视频模式(上例中的图片分辨率)。物理像素是显示器的像素。渲染时,您只能使用第一种操作。

这使我们得出结论,当您以与显示器的原始分辨率完全相同的分辨率渲染图形时,您可以放心地说您将其渲染为“物理像素”。

在统一中,您可以向渲染器传递一些外部数据(这可能包括您当前的屏幕分辨率(例如,作为Vector2,请参阅this)。 但是,您很可能不需要这些,因为像素着色器已经对像素进行操作(渲染像素,由您当前的视频模式决定)。这意味着如果您使用的分辨率小于原生分辨率,则很可能无法渲染单个像素。

希望它有所帮助。