RenderDoc截帧DXBC编译 一文详解(下)
Thepoly原创 14330 0
实名

通过了实名认证的内容创造者

发布于 2023-4-27 14:28:28

您需要 登录 才可以下载或查看,没有账号?注册

x

81206981b603f57a91c07389ac43df78.jpg
Hello . 大家好
今天给大家带来的是 一文详解RenderDoc截帧DXBC编译我是守城的麦田
a8e7f8990925571c6f19c9a600dbce26.png
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 -




还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表