Unity ShaderLab 中的像素完美着色器
Pixel-perfect shader in Unity ShaderLab
在 Unity 中,编写着色器时,
着色器本身是否可以 "know" 屏幕分辨率是多少,并且着色器确实可以控制单个物理像素?
我只考虑为 2D 对象编写着色器的情况(例如 UI
使用,或者在任何情况下使用正射相机)。
(当然,通常要在屏幕上显示物理像素完美的 PNG,您只有 400 像素的 PNG,并且您安排缩放以便着色器恰好绘制到 400 物理像素。我想知道的是一个只绘制的着色器,例如物理像素完美的黑线 - 它必须 "know" 正是物理像素所在的位置。)
我认为这不会发生。您的渲染与当前选择的视频模式相关联,甚至不必与您的物理屏幕尺寸相匹配(如果这是您的意思 pixel-perfect)。
最接近的情况是,如果您以显示设备的推荐分辨率进行渲染并使用像素着色器为整个屏幕着色。这样,一个 'physical pixel' 将大致等于一个实际渲染像素。除此之外,不可能将物理(即显示器的)像素与渲染像素相关联。
当然,除非我以某种方式误解了您的意图。
is it possible for the shader itself to "know" what the screen resolution is
我不这么认为。
and indeed for the shader to control single physical pixels?
是的。像素着色器知道它们正在绘制什么像素,也可以对其他像素进行采样。
有一个名为 _ScreenParams 的 ShaderLab 内置值。
_ScreenParams.x 是以像素为单位的屏幕宽度。
_ScreenParams.y 是以像素为单位的屏幕高度。
这是文档页面:http://docs.unity3d.com/462/Documentation/Manual/SL-BuiltinValues.html
首先,请定义'Pixel perfect'和'Physical pixel'。
如果您所说的物理像素是指显示器的像素(显示器、笔记本电脑显示器、您可能使用的任何其他硬件),那么您就不走运了。着色器不会对它们进行操作,它们会自行操作 'abstract pixels'.
你可以这样想:
您的图形以具有某种可配置分辨率(例如 800x600 像素)的图片呈现。您仍然可以在 1920x1080 显示器上全屏显示此图片,没问题,但它看起来很糟糕。这就是实际显示和视频卡渲染所发生的情况。决定渲染像素实际数量的是您的视频模式(上例中的图片分辨率)。物理像素是显示器的像素。渲染时只能对第一种进行操作
这使我们得出一个结论,当您以与显示器的原始分辨率完全相同的分辨率渲染图形时,您可以放心地说您最终将其渲染为 'Physical Pixels'。
在 unity 中,您可以向渲染器传递一些外部数据(这可能包括您当前的屏幕分辨率(例如作为 Vector2,请参阅 this)。
然而,您很可能不需要这些,因为像素着色器已经在像素上运行(渲染像素,由您当前的视频模式决定)。这意味着如果您使用的分辨率低于您的原始分辨率,您很可能无法渲染单个像素。
希望对您有所帮助。
在 Unity 中,编写着色器时,
着色器本身是否可以 "know" 屏幕分辨率是多少,并且着色器确实可以控制单个物理像素?
我只考虑为 2D 对象编写着色器的情况(例如 UI
使用,或者在任何情况下使用正射相机)。
(当然,通常要在屏幕上显示物理像素完美的 PNG,您只有 400 像素的 PNG,并且您安排缩放以便着色器恰好绘制到 400 物理像素。我想知道的是一个只绘制的着色器,例如物理像素完美的黑线 - 它必须 "know" 正是物理像素所在的位置。)
我认为这不会发生。您的渲染与当前选择的视频模式相关联,甚至不必与您的物理屏幕尺寸相匹配(如果这是您的意思 pixel-perfect)。
最接近的情况是,如果您以显示设备的推荐分辨率进行渲染并使用像素着色器为整个屏幕着色。这样,一个 'physical pixel' 将大致等于一个实际渲染像素。除此之外,不可能将物理(即显示器的)像素与渲染像素相关联。
当然,除非我以某种方式误解了您的意图。
is it possible for the shader itself to "know" what the screen resolution is
我不这么认为。
and indeed for the shader to control single physical pixels?
是的。像素着色器知道它们正在绘制什么像素,也可以对其他像素进行采样。
有一个名为 _ScreenParams 的 ShaderLab 内置值。
_ScreenParams.x 是以像素为单位的屏幕宽度。 _ScreenParams.y 是以像素为单位的屏幕高度。
这是文档页面:http://docs.unity3d.com/462/Documentation/Manual/SL-BuiltinValues.html
首先,请定义'Pixel perfect'和'Physical pixel'。
如果您所说的物理像素是指显示器的像素(显示器、笔记本电脑显示器、您可能使用的任何其他硬件),那么您就不走运了。着色器不会对它们进行操作,它们会自行操作 'abstract pixels'.
你可以这样想: 您的图形以具有某种可配置分辨率(例如 800x600 像素)的图片呈现。您仍然可以在 1920x1080 显示器上全屏显示此图片,没问题,但它看起来很糟糕。这就是实际显示和视频卡渲染所发生的情况。决定渲染像素实际数量的是您的视频模式(上例中的图片分辨率)。物理像素是显示器的像素。渲染时只能对第一种进行操作
这使我们得出一个结论,当您以与显示器的原始分辨率完全相同的分辨率渲染图形时,您可以放心地说您最终将其渲染为 'Physical Pixels'。
在 unity 中,您可以向渲染器传递一些外部数据(这可能包括您当前的屏幕分辨率(例如作为 Vector2,请参阅 this)。 然而,您很可能不需要这些,因为像素着色器已经在像素上运行(渲染像素,由您当前的视频模式决定)。这意味着如果您使用的分辨率低于您的原始分辨率,您很可能无法渲染单个像素。
希望对您有所帮助。