关于对齐次裁剪空间及HLSL语义的理解

struct VertexIn
{
    float3 pos : POSITION;
    float4 color : COLOR;
};

struct VertexOut
{
    float4 posH : SV_POSITION;
    float4 color : COLOR;
};
float4 PS(VertexOut pIn) : SV_Target//系统值,渲染目标
{
    return pIn.color;
}
// 顶点着色器
VertexOut VS(VertexIn vIn)
{
    VertexOut vOut;
    vOut.posH = float4(vIn.pos, 1.0f);//齐次裁剪空间,多加一维,是一个点
    vOut.color = vIn.color; // 这里alpha通道的值默认为1.0
    return vOut;
}

之前对顶点着色器仅了解一点点,后面再学习的时候,发现忘得差不多,想不起来大概,所以又重新屡了一遍思路。

齐次空间:

齐次空间是什么?

        简单来说,就是在N维空间的基础上再加一维。比如说,N维向量的齐次空间就是N+1维的。但是,我们并不是随便地升维的,要是N维空间是个点,则升维时加1;如果是个向量,就加0;像三维的(2,3,1)变成(2,3,1,1)是一个四维空间下的点;若变成(2,3,1,0)则是四维空间下的一个向量。这种升维的操作主要目的是为了向量或点在高维变换后再转回低维。(一句话来说,转高维就是为了简化变换)

齐次裁剪空间又是什么?

        渲染管线中进行裁剪的位置是透视投影之后,齐次除法之前。过程如下图所示:

        思路很明确,齐次裁剪空间就是在透视之后,对视锥体之外的物体进行剔除的空间。透视之后如下图所示,得到摄像机的视锥体,这种空间称为视锥体裁剪空间。

所以代码中的pos和posH变量就很好理解了,下面所展示就是这些变量名的一些约定。

字母后缀含义
L处于物体局部空间(Local Space)
W处于世界空间(World Space)
V处于观察空间(View Space)
H处于齐次裁减空间(Homogeneous space)

HLSL语义:

上面代码有一行是SV_Taregt,这是什么意思呢?SV的意思是指System Value,即系统值。还有诸如POSITION,SV_POSITION,COLOR这些都有‘ :’在前面修饰的。都是什么意思呀?那都是语义,因为着色器编程是在GPU中完成的,所以不会像CPU拥有堆栈来设置变量以存储数据,也就是说,可以把语义理解为像INT、DOUBLE的关键字。他们都是用来存储数据的。

系统语义:

System-Value语义说明类型
SV_ClipDistance[n]剪辑距离数据。 SV_ClipDistance值都假定为平面的 float32 带符号距离。 基元设置仅对内插平面距离 () >为 0 的像素调用光栅化。 通过将一个或多个顶点元素的多个组件声明为SV_ClipDistance,可以同时实现多个剪辑平面 () 。 组合的剪辑和剔除距离值最多是 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 组件,大多数为 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 寄存器。 可供读取或写入的所有着色器使用,但顶点着色器可以写入值,但不能将其用作输入。
剪辑平面属性的工作方式类似于SV_ClipDistance,但适用于所有硬件功能级别9_x及更高版本。 有关详细信息,请参阅 功能级别 9 硬件上的用户剪辑平面
FLOAT
SV_CullDistance[n]剔除距离数据。 如果为 (顶点元素 () 的组件) ,则每个值都假定为平面的 float32 带符号距离。 如果基元中的所有顶点的平面距离 () 为 < 0,则完全放弃基元。 可以通过将一个或多个顶点元素的多个组件 () 声明为SV_CullDistance来同时使用多个布尔平面。 组合的剪辑和剔除距离值最多是 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 组件,大多数为 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 寄存器。 可供读取或写入的所有着色器使用,但顶点着色器可以写入值,但不能将其用作输入。FLOAT
SV_Coverage可以在输入、输出或两个像素着色器上指定的掩码。
对于像素着色器上的SV_Coverage,ps_4_1或更高版本支持 OUTPUT。
对于像素着色器上的SV_Coverage,INPUT 需要ps_5_0或更高版本。
uint
SV_Depth深度缓冲区数据。 可以通过像素着色器编写。FLOAT
SV_DepthGreaterEqual在像素着色器中,只要深度大于或等于光栅器确定的值,就可以输出深度。 启用调整深度而不禁用早期 Z。FLOAT
SV_DepthLessEqual在像素着色器中,只要深度小于或等于光栅器确定的值,就可以输出深度。 启用调整深度而不禁用早期 Z。FLOAT
SV_DispatchThreadID定义组的每个维度的 Dispatch 调用中的全局线程偏移量。 可用作计算着色器的输入。 (只读)uint3
SV_DomainLocation定义正在计算的当前域点外壳上的位置。 可用作域着色器的输入。 (只读)float2|3
SV_GroupID定义 Dispatch 调用中的组偏移量,每个调度调用的维度。 可用作计算着色器的输入。 (只读)uint3
SV_GroupIndex为给定组中的给定线程提供平展索引。 可用作计算着色器的输入。 (只读)uint
SV_GroupThreadID定义组中每个维度的线程偏移量。 可用作计算着色器的输入。 (只读)uint3
SV_GSInstanceID定义几何着色器的实例。 可用作几何着色器的输入。 需要实例,因为同一几何图形基元上最多可以调用几何着色器 32 次。uint
SV_InnerCoverage表示 (低估的保守光栅化信息,即是否保证像素完全覆盖) 。 可以由像素着色器读取或写入。
SV_InsideTessFactor定义修补图面中的细化量。 在外壳着色器中可用于写入,并在域着色器中可用于读取。float|float[2]
SV_InstanceID运行时自动生成的每个实例标识符 (请参阅 使用 Direct3D 1) 0) direct3D 10 System-Generated (值 。 适用于所有着色器。
SV_IsFrontFace指定三角形是否正面。 对于行和点,IsFrontFace 的值为 true。 例外是 (线框模式) 绘制出三角形的线条,该模式设置 IsFrontFace 的方式与在实心模式下光栅化三角形的方式相同。 可以由几何着色器写入,并由像素着色器读取。bool
SV_OutputControlPointID定义通过调用外壳着色器的主要入口点来操作的控制点 ID 的索引。 只能由外壳着色器读取。uint
SV_Position当为着色器输入声明SV_Position时,它可以指定两种内插模式之一:linearNoPerspective 或 linearNoPerspectiveCentroid,后者会导致在多重采样抗锯齿时提供质心贴靠 xyzw 值。 在着色器中使用时,SV_Position描述像素位置。 在所有着色器中可用,以获取具有 0.5 偏移量的像素中心。float4
SV_PrimitiveID运行时自动生成的每基元标识符 (请参阅 使用 direct3D 1) 0) 使用 System-Generated 值 (Direct3D 10 。 可以由几何图形或像素着色器写入,并由几何图形、像素、外壳或域着色器读取。uint
SV_RenderTargetArrayIndex呈现目标数组索引。 应用于几何着色器输出,并指示基元将由像素着色器绘制到的呈现目标数组切片。 仅当呈现目标为数组资源时,SV_RenderTargetArrayIndex才有效。 此语义仅适用于基元;如果基元有多个顶点,则使用前导顶点中的值。 此值还指示深度/模具视图的数组切片用于读/写。
可以从几何着色器写入,并由像素着色器读取。
如果为 D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue,则SV_RenderTargetArrayIndex应用于馈送光栅器的任何着色器。
uint
SV_SampleIndex采样频率索引数据。 只能由像素着色器读取或写入。uint
SV_StencilRef表示当前像素着色器模具引用值。 只能由像素着色器编写。uint
SV_Target[n],其中 0 <= n <= 7将存储在呈现目标的输出值。 索引指示要写入的 8 个可能绑定的呈现目标中的哪一个。 该值适用于所有着色器。float[2|3|4]
SV_TessFactor定义补丁的每个边缘上的分割量。 可用于在外壳着色器中写入,并在域着色器中读取。float[2|3|4]
SV_VertexID运行时自动生成的每个顶点标识符 (请参阅 使用 Direct3D 10 (Direct3D 10) ) System-Generated值 。 仅作为顶点着色器的输入提供。uint
SV_ViewportArrayIndex视区数组索引。 应用于几何图形着色器输出,并指示当前要写入的基元使用的视区。可以由像素着色器读取。 在将基元传递给光栅器之前,将针对索引指定的视区进行转换和剪裁。 此语义仅适用于基元;如果基元有多个顶点,则使用前导顶点的值。
如果D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue,则SV_ViewportArrayIndex应用于为光栅器馈送的任何着色器。
uint
SV_ShadingRate通过底纹速率 定义由一个像素着色器调用为 可变着色速率第 2 层或更高版本设备写入的像素数。 可以从像素着色器读取。 可以从顶点或几何图形着色器编写。uint

像素着色器语义:

输入说明类型
COLOR[n]漫射或反射颜色。float4
TEXCOORD[n]纹理坐标float4
VFACE指示面向背的基元的浮点标量。 负值向后面,而正值则面对相机。
[!注意]
Direct3D 9 着色器模型 3.0 中提供了此语义。 对于 Direct3D 10 及更高版本,请改用  SV_IsFrontFace 。
FLOAT
VPOS屏幕空间中的像素位置 (x,y) 。 若要将此语义 () 的 Direct3D 9 着色器转换为 Direct3D 10 及更高版本的着色器,请参阅 Direct3D 9 VPOS 和 Direct3D 10 SV_Position)float2
输出说明类型
COLOR[n]输出颜色float4
DEPTH[n]输出深度FLOAT

顶点着色器语义:

输入说明类型
BINORMAL[n]二进制float4
BLENDINDICES[n]混合索引uint
BLENDWEIGHT[n]混合权重FLOAT
COLOR[n]漫射和反射颜色float4
NORMAL[n]普通向量float4
POSITION[n]对象空间中的顶点位置。float4
POSITIONT转换的顶点位置。float4
PSIZE[n]点大小FLOAT
TANGENT[n]正切float4
TEXCOORD[n]纹理坐标float4
输出说明类型
COLOR[n]漫射或反射颜色float4
顶点雾FLOAT
POSITION[n]顶点在同质空间中的位置。 通过将 (x,y,z) 除以 w,在屏幕空间中计算位置。 每个顶点着色器都必须写出具有此语义的参数。float4
PSIZE点大小FLOAT
TESSFACTOR[n]分割因子FLOAT

 参考:高级着色器语言 (HLSL) - Win32 apps | Microsoft Docs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值