您需要 登录 才可以下载或查看,没有账号?注册
x
Hello . 大家好
今天给大家带来的是 一文详解RenderDoc截帧DXBC编译我是守城的麦田
1DXBC回顾我们先来回顾一下上篇的内容:
RenderDoc截帧DXBC编译 一文详解(上)
2获取内容相比上篇,只是将上篇的颜色输入增加了贴图类型输入。下图为Unity内预览效果。
还是对其进行RenderDoc,获得到的DXBC顶点如下所示:
vs_4_0 dcl_constantbuffer cb0[77], immediateIndexed dcl_constantbuffer cb1[4], immediateIndexed dcl_constantbuffer cb2[1], immediateIndexed dcl_input v0.xyz dcl_input v1.xy dcl_output_siv o0.xyzw, position dcl_output o1.xy dcl_temps 2 0: mul r0.xyzw, v0.yyyy, cb1[1].xyzw 1: mad r0.xyzw, cb1[0].xyzw, v0.xxxx, r0.xyzw 2: mad r0.xyzw, cb1[2].xyzw, v0.zzzz, r0.xyzw 3: add r0.xyzw, r0.xyzw, cb1[3].xyzw 4: mul r1.xyzw, r0.yyyy, cb0[74].xyzw 5: mad r1.xyzw, cb0[73].xyzw, r0.xxxx, r1.xyzw 6: mad r1.xyzw, cb0[75].xyzw, r0.zzzz, r1.xyzw 7: mad o0.xyzw, cb0[76].xyzw, r0.wwww, r1.xyzw 8: mad o1.xy, v1.xyxx, cb2[0].xyxx, cb2[0].zwzz 9: retDXBC片元如下所示:
ps_4_0 dcl_constantbuffer cb0[20], immediateIndexed dcl_sampler s0, mode_default dcl_resource_texture2d (float,float,float,float) t0 dcl_input_ps linear v1.xy dcl_output o0.xyzw 0: sample_b o0.xyzw, v1.xyxx, t0.xyzw, s0, cb0[19].x 1: ret原UnityShader如下所示:
2开始分析
VS阶段
相比上篇,Data阶段多输入了一个UV信息,即float2 uv : TEXCOORD0;对应DXBC的dcl_constantbuffer cb2[1], immediateIndexedUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);对应VS阶段内的计算mad o1.xy, v1.xyxx, cb2[0].xyxx, cb2[0].zwzz由上篇分析的mad指令,这里直接可翻译为:o1.xy = v1.xyxx * cb2[0].xyxx + cb2[0].zwzz,即:Unity内对TRANSFORM_TEX的预定义:#define TRANSFORM_TEX(tex, name) ((tex.xy) * name##_ST.xy + name##_ST.zw)PS阶段dcl_sampler指令 声明采样器寄存器。 官方解释地址:
https://learn.microsoft.com/zh-c ... t3dhlsl/dcl-sampler 语法:dcl_sampler sN,模式 示例:dcl_sampler s3, default
dcl_resource_texture2d指令声明一个Texture2D类型的贴图
dcl_input指令上篇介绍了dcl_input指令第一种用法声明着色器输入寄存器语法:dcl_input vN[.mask][, 内插Mode]N 是标识寄存器号的整数。[.mask] 是一个可选组件掩码 (.xyzw) ,指定要使用的注册组件。这里新增一个interpolationMode用法,该用法为可选模式有以下几种输入:常量 - 不要在寄存器值之间内插。linear - 在寄存器值之间线性内插。linearCentroid - 与多重采样时固定的线性但质心相同。linearNoperspective - 与线性相同,但没有透视更正。linearNoperspectiveCentroid与在多重采样时固定的线性质心相同,无透视更正。dcl_input_ps linear v1.xy对应的正是VS阶段传过来的UV数据。
dcl_output 指令声明着色器输出寄存器。
sample_b指令采样贴图官方解释如下:
由上图可知语法为:sample_b[_aoffimmi (u,v,w) ] dest[.mask], srcAddress[.swizzle],srcResource[.swizzle], srcSampler, srcLODBias.select_component
sample_b o0.xyzw, v1.xyxx, t0.xyzw, s0, cb0[19].x则分别对应,最后的输出值,UV,采样贴图,采样器,常量缓冲区范围。
至此,RenderDoc截帧DXBC编译 一文详解分析结束,其他的渲染情况大家可以依据官方文档举一反三。
- End -
|