Windows Terminal中的像素着色器

2021-01-30 07:31:36

由于GPU中强大的计算能力,人们可以使用像素着色器完成出色的工作,例如实时分形缩放,光线跟踪和图像处理。

Windows终端允许用户提供将应用于终端的像素着色器。要试用,请将以下设置添加到您的一个配置文件中:

注意:如果您指定一个带有shader.pixelShaderPath的着色器,则终端将使用该着色器,而不是experimental.retroTerminalEffect。

要开始在终端中使用像素着色器,请从以下示例着色器开始。这是此目录中的Invert.hlsl:

//反转颜色的最小像素着色器//将终端图形作为纹理Texture2D shaderTexture; SamplerState samplerState; //终端设置,例如纹理缓存的分辨率PixelShaderSettings {//自启用像素着色器以来的时间float Time; // UI Scale float Scale; // shader的分辨率Texture float2 Resolution; //背景颜色为rgba float4 Background;}; //像素着色器是给定纹理坐标(tex)产生颜色的程序// //忽略pos参数float4 main(float4 pos:SV_POSITION,float2 tex:TEXCOORD):SV_TARGET {//读取颜色值当前纹理坐标(tex)// float4是4个float的元组,rgba float4 color = shaderTexture。样本(samplerState,tex); //反转rgb值(xyz),但不要触摸alpha(w)color.xyz = 1.0-color.xyz; //返回最终的颜色返回颜色;}

保存设置文件后,使用更改的配置文件打开终端。现在,它应该反转屏幕的颜色!

如果您的着色器无法编译,终端将显示警告对话框,并暂时忽略它。修复着色器后,再次触摸settings.json文件,或打开一个新选项卡,终端将尝试再次加载着色器。

我们用于编写像素着色器的语言称为HLSL。它是一种类似于C的语言,但有一些限制。您不能分配内存,使用指针或递归。您可以访问的是最近相当不错的GPU在teraflop范围内的计算能力。这意味着编写实时光线跟踪器或其他炫酷效果是有可能的。

shadertoy是一个很棒的网站,它展示了像素着色器(尽管在GLSL中)可能发生的情况。例如,这种海绵。一旦掌握了窍门,从GLSL转换为HLSL并不难。

让我们尝试一个更复杂的示例。栅格栏在80年代很酷,因此让我们添加一下。首先像这样修改着色器:(这是Rasterbars.hlsl)

//最小的像素着色器,用于显示一些栅格条//终端图形作为纹理Texture2D shaderTexture; SamplerState samplerState; //终端设置,例如纹理缓存的分辨率PixelShaderSettings {//自启用像素着色器以来的时间float Time; // UI Scale float Scale; // shader的分辨率Texture float2 Resolution; //背景颜色为rgba float4 Background;}; //像素着色器是给定纹理坐标(tex)产生颜色的程序// //忽略pos参数float4 main(float4 pos:SV_POSITION,float2 tex:TEXCOORD):SV_TARGET {//读取颜色值当前纹理坐标(tex)// float4是4个float的元组,rgba float4 color = shaderTexture。样本(samplerState,tex); //读取偏移量的颜色值,将其用作阴影float4 ocolor = shaderTexture。 Sample(samplerState,tex + 2.0 * Scale * float2(-1.0,-1.0)/Resolution.y); //栅格的厚度const float厚度= 0.1; float ny = floor(tex.y / thickness);浮动我= tex.y%厚度; const float pi = 3.141592654; // ny用于计算栅格栏的基本颜色float cola = ny * 2.0 * pi; float3 col = 0.75+ 0.25 * float3(sin(可乐* 0.111),sin(可乐* 0.222),sin(可乐* 0.333)); // my用于计算光栅条的亮度// smoothstep是一个很棒的小功能:https://en.wikipedia.org/wiki/Smoothstep float亮度= 1.0- smoothstep(0.0,厚度* 0.5,abs(my-0.5 *厚度)); float3 rasterColor = col *亮度; // lerp(x,y,a)是另一个非常有用的函数:https://en.wikipedia.org/wiki/Linear_interpolation float3 final = rasterColor; //创建终端图形的阴影// // w是alpha通道,0是完全透明的,1是完全不透明的final = lerp(final,float(0.0),ocolor.w); //绘制终端图形final = lerp(final,color.xyz,color.w); //返回最终颜色,将alpha设置为1(即不透明)return float4(final,1.0);}

重新加载后,它应该在背景中显示一些复古的光栅条,并带有阴影以使文本更易读。

作为更复杂的示例,此目录中的Retro.hlsl文件包含了终端机内置的experimental.retroTerminalEffect。随时进行修改和实验!