在Unity中,编写着色器时,
着色器本身有可能“知道”屏幕分辨率是多少,并且着色器确实可以控制单个物理像素吗?
[我仅考虑为2D对象编写着色器的情况(例如用于UI
,或在任何情况下使用正交相机)。
((当然,通常要在屏幕上显示一个物理像素完美的PNG,您只有一个400像素的PNG,然后进行缩放,以便着色器恰好可以绘制到400个物理像素。我是我想知道的是仅绘制一个着色器的着色器,例如一条物理像素完美的黑线-它必须“确切地”知道物理像素在哪里。)
有一个称为_ScreenParams的ShaderLab内置值。
_ ScreenParams.x是屏幕宽度,以像素为单位。_ScreenParams.y是屏幕高度(以像素为单位)。
这里是文档页面:http://docs.unity3d.com/462/Documentation/Manual/SL-BuiltinValues.html
我认为这不会发生。您的渲染与当前选择的视频模式相关,甚至不必匹配您的物理屏幕尺寸(如果这就是像素完美的含义)。
您将获得的最接近的结果是,如果以推荐的分辨率为显示设备渲染并使用像素着色器来着色整个屏幕。这样,一个“物理像素”将大致等于一个实际渲染的像素。除此之外,不可能将物理(即显示器的)像素与渲染的像素相关联。
当然,除非我以某种方式误解了您的意图。
着色器本身有可能“知道”屏幕分辨率是什么
我不这么认为。
并且确实是用于控制单个物理像素的着色器?
是。像素着色器知道他们要绘制的像素,也可以对其他像素进行采样。
首先,请定义“像素完美”和“物理像素”。
如果用物理像素表示显示器的像素(显示器,笔记本电脑显示器以及您可能使用的任何其他硬件),那么您就不走运了。着色器不对这些对象进行操作,它们对自己的“抽象像素”进行操作。
您可以这样考虑:您的图形以具有可配置分辨率(例如800x600像素)的图片呈现。您仍然可以在全屏1920x1080显示屏上显示此图片,没问题,尽管看起来很烂。这就是实际的显示和视频卡渲染过程。决定实际渲染像素数量的是视频模式(上例中图片的分辨率)。物理像素是显示器的像素。渲染时只能使用第一种。
这得出一个结论,当您以与显示器的原始分辨率完全相同的分辨率渲染图形时,可以放心地说,您很乐意将其渲染为“物理像素”。
整体上,您可以向渲染器传递一些外部数据(这可能包括您当前的屏幕分辨率(例如,作为Vector2,请参见this))。但是,您很可能不需要任何这些,因为像素着色器已经可以对像素进行操作(渲染的像素,由您当前的视频模式确定)。这意味着,如果您使用的分辨率低于原始分辨率,则很可能无法渲染单个像素。
希望它有所帮助。