6月第十三讲,在WPF中使用着色器

范畴CPUGPU
二进制文件.exe.cso / .ps
二进制指令机器码CSO(shader指令)
助记符汇编SL
高级语言C#HLSL
高级语言文件.cs.hlsl / .fx
高级语言编译器csc.exefxc.exe
API.NET APIDirectX API
运行时环境CLRDirectX
调试工具Visual Studio DebuggerRenderDoc
  • 着色器类型
着色器简称着色器名解释
cs_4_0Compute Shader model 4.0计算着色器,用于处理非图形计算任务
ds_5_0Domain Shader model 5.0域着色器,用于曲面细分技术中,生成顶点后处理顶点数据
fx_2_0Effect model 2.0效果文件,用于组合多个渲染状态和着色器程序,方便管理和使用
gs_4_0Geometry Shader model 4.0几何着色器,能接收一些图形形状作为输入,并输出其他形状,用于生成新顶点和图形
hs_5_0Hull Shader model 5.0曲面控制着色器,用于图形的曲面细分
ps_2_0Pixel Shader model 2.0像素着色器,用于计算像素颜色
tx_1_0Texture Shader model 1.0 (software)纹理着色器,主要用于处理纹理映射
vs_1_1Vertex Shader model 1.1顶点着色器,用于处理每个顶点数据

3DS Max HLSL编写与预览

  • 首先,为了避免折腾和跟上b站的视频教程,下载3DS Max,接着添加一个茶壶
    只是教程用的是Direct9,我们现在用的是Direct11,语法有点差异

    image


    打开3DS Max,按下快捷键M,或者点击材质编辑器

    image


    然后切换模式,换成精简材质编辑器

    image


    点击物理材质切换自己写的shader

    image


    选择DirectX Shader材质

    image


    点击确定

    image


    点击路径,可选择自定义材质

    image

可以事先在桌面上新建一个txt文件,然后把扩展名改为.fx,可以使用vscode或者visualStudio下载HLSL扩展进行编辑
这列我提供一个Direct11的最简单的纯色着色器效果文件solidColor.fx

<br><a href="https://www.iqiyi.com/playlist2878672415347902.html">5KJDG</a>
<br><a href="https://www.iqiyi.com/playlist4665095758174602.html">3JKDG</a>
<br><a href="https://www.iqiyi.com/playlist5557104180813602.html">3SLDG</a>
<br><a href="https://www.iqiyi.com/playlist3420134362542702.html">GSFF4</a>
<br><a href="https://www.iqiyi.com/playlist6454727764391602.html">GADG4</a>
<br><a href="https://www.iqiyi.com/playlist6442695276678202.html">GASD6</a>
<br><a href="https://m.iqiyi.com/playlist5557104180813602.html">CVEF3</a>
<br><a href="https://m.iqiyi.com/playlist3420134362542702.html">DAC4F</a>
<br><a href="https://m.iqiyi.com/playlist6454727764391602.html">FASD2</a>
<br><a href="https://m.iqiyi.com/playlist6442695276678202.html">FAHH5</a>
<br><a href="https://m.iqiyi.com/playlist2878672415347902.html">3TCDG</a>
<br><a href="https://m.iqiyi.com/playlist4665095758174602.html">Y6EDG</a>

// solidColor.fx


//世界投影矩阵
//用来将顶点从模型空间转换到最终的裁剪空间
float4x4 WorldViewProjection : WorldViewProjection < string UIWidget="None"; >;

//UI面板项目
float4 SolidColor
<
    string UIWidget = "Color";
    string UIName="Solid Color";
> = float4(1.0f, 1.0f, 1.0f, 1.0f);

struct VertexShaderInput
{
    //顶点着色器输入用这个语义
    //表示顶点的位置信息
    //模型空间(或世界空间)中定义的
    float4 Position : POSITION;
};

struct VertexShaderOutput
{
    //顶点着色器输出用这个语义
    //表示顶点在裁剪空间(Clip Space)中的位置
    //用来决定顶点在屏幕上位置的空间
    float4 Position : SV_Position;
};

struct PixelShaderOutput
{
    float4 Color : SV_TARGET;
};

//================== 简单的顶点着色器函数
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;

    // 计算最终的顶点位置
    output.Position = mul(input.Position, WorldViewProjection);

    return output;
}


//=============== 基本像素着色器函数
PixelShaderOutput PixelShaderFunction()
{
    PixelShaderOutput output;

    // 设置像素颜色为 SolidColor 定义的颜色
    output.Color = SolidColor;

    return output;
}

// 定义渲染效果
//Direct9写technique
//Direct10写technique10
//Direct11写technique11
technique11 SolidColorTechnique
{
    pass P0
    {
        // 基本顶点着色器
        VertexShader = compile vs_5_0 VertexShaderFunction();

        // 基本像素着色器
        PixelShader = compile ps_5_0 PixelShaderFunction();
    }
}

然后把这个材质拖到模型上
 

image


参数Solid Color是我们在代码中定义的组件,用来选材质颜色

float4 SolidColor
<
    string UIWidget = "Color";
    string UIName="Solid Color";
> = float4(1.0f, 1.0f, 1.0f, 1.0f);

image

WPF着色器编写与使用

看了下,似乎wpf只支持像素着色器,不支持顶点着色器。那代码就简化许多了。
第二个问题是wpf中没有通过HLSL生成UI控件,怎么调整SolidColor?
我看了下HLSL变量声明语法,原来<DataType名称 = 值;... ;>是批注语法效果框架能识别,但会被hlsl忽略
变量语法 - Win32 apps | Microsoft Learn

[Storage_Class] [Type_Modifier] Type Name[Index] [: Semantic] [: Packoffset] [: Register]; [Annotations] [= Initial_Value]

wpf中使用的则是Register可选部分,从寄存器读取输入

wpfSolidColor.fx

struct PixelShaderOutput
{
    float4 Color : SV_TARGET;
};
float4 SolidColor : register(c0) = float4(1.0f, 1.0f, 1.0f, 1.0f);

//=============== 基本像素着色器函数
PixelShaderOutput PixelShaderFunction()
{
    PixelShaderOutput output;

    // 设置像素颜色为 SolidColor 定义的颜色
    output.Color = SolidColor;

    return output;
}
  • 编译
    然后使用效果编译工具fxc.exe编译这个文件
    ./fxc /T ps_3_0 /E PixelShaderFunction /Fo TextEffect2.ps wpfSolidColor.fx
    注意,wpf支持的directx版本比较老,这里只能用ps_3_0ps_2_0
    语法 - Win32 apps | Microsoft Learn
    之后把TextEffect2.ps拷贝到项目,把生成方式改为资源
    在添加一个效果类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值