Shader_GLSL、HLSL API异同对比
工作中,常常使用到GLSL或HLSL,对于其各自内置函数、各自独有函数、通用函数经常会出现混淆,现结合资料总结如下,方便后续查找。
本文主要参照khronos与微软官方文档:GLSL、HLSL。
注:SPIR-V中间层着色器语言可以通过Vulkan自带着色器转换工具进行处理(GLSL、HLSL to SPV),故此处不再赘述。
一、不同之处
1.1 系统参数与內建参数
D3D有很多系统参数,而相应的,GLSL也有內建的输入参数的概念。他们的对应关系如下:
HLSL | GLSL |
---|---|
SV_ClipDistance | gl_ClipDistance |
SV_CullDistance | 当存在ARB_cull_distance情况下gl_CullDistance |
SV_Coverage | gl_SampleMaskIn & gl_SampleMask |
SV_Depth | gl_FragDepth |
SV_DepthGreaterEqual | layout (depth_greater) out float gl_FragDepth; |
SV_DepthLessEqual | layout (depth_less) out float gl_FragDepth; |
SV_DispatchThreadID | gl_GlobalInvocationID |
SV_DomainLocation | gl_TessCord |
SV_GroupID | gl_WorkGroupID |
SV_GroupIndex | N/A |
SV_GroupThreadID | gl_LocalInvocationID |
SV_GSInstanceID | gl_InvocationID |
SV_InsideTessFactor | gl_TessLevelInner |
SV_InstanceID | gl_InstanceID & gl_InstanceIndex (后面的 Vulkan 会有不同的语义) |
SV_IsFrontFace | gl_FrontFacing |
SV_OutputControlPointID | gl_InvocationID |
N / A | gl_PatchVerticesIn |
SV_Position | VS:gl_Position;PS:gl_FragCoord |
SV_PrimitiveID | gl_PrimitiveID |
SV_RenderTargetArrayIndex | gl_Layer |
SV_SampleIndex | gl_SampleID |
通过EvaluateAttributeAtSample可以达到等价 | gl_SamplePosition |
SV_StencilRef | 当存在ARB_cull_distance情况下gl_FragStencilRef |
SV_Target | layout(location=N) out your_var_name |
SV_TessFactor | gl_TessLevelOuter |
SV_VertexID | gl_VertexID & gl_VertexIndex (后面的Vulkan会有不同的语义) |
SV_ViewportArrayIndex | gl_ViewportIndex |
1.2 原子操作
原子操作的对应关系非常简单。将Interlocked换成atomic。因此InterlockedAdd则替换成atomicAdd,以此类推。唯一的区别就是InterlockedCompareExchange要换成atomicCompSwap。
1.3 共享/本地内存
HLSL中的groupshared 内存就是GLSL中的shared 内存。仅此而已。
1.4 内存屏障
HLSL | GLSL |
---|---|
GroupMemoryBarrierWithGroupSync | groupMemoryBarrier 和 barrier |
GroupMemoryBarrier | groupMemoryBarrier |
DeviceMemoryBarrierWithGroupSync | memoryBarrier,memoryBarrierImage, memoryBarrierImage和barrier |
AllMemoryBarrierWithGroupSync | 上面所有的内存栅栏 和 barrier |
AllMemoryBarrier | 上面所有的内存栅栏 |
N/A | memoryBarrierShared |
1.5 纹理访问
在没有Vulkan之前,贴图是整体绑定的,不可能部分访问。幸运的是, Vulkan使用和HLSL类似的语义,使得这部分可以有所不同。这个主要区别在于,HLSL中访问方法是“纹理对象”的一部分,而在GLSL,他们使用的是自由函数。在HLSL中,您要用一个Sampler采样器去采样一张Texture纹理贴图如下:
Texture.Sample (Sampler, coordinate)
在GLSL中,你需要指定纹理的类型和采样器的类型,除此之外,基本是一样的:
texture (sampler2D(Texture, Sampler), coordinate)
具体采样相关函数:
HLSL | GLSL |
---|---|
CalculateLevelOfDetail & CalculateLevelOfDetailUnclamped | textureQueryLod |
Load | texelFetch 和 texelFetchOffset |
GetDimensions | textureSize, textureQueryLevels 和textureSamples |
Gather | textureGather, textureGatherOffset, textureGatherOffsets |
Sample, SampleBias | texture, textureOffset |
SampleCmp | samplerShadow |
SampleGrad | textureGrad, textureGradOffset |
SampleLevel | textureLod, textureLodOffset |
N/A | textureProj |
1.6 矩阵运算
GLSL和HLSL对默认矩阵阐释有所不同。GLSL使用列优先右乘矩阵(也就是,你用的是 M * V),HLSL使用行优先左乘矩阵(V* M)然而你通常可以忽略这些-你可以重载这个命令,使之可以在左右两边都能进行乘法 –这将会改变矩阵m中m[0]的含义。在HLSL中,将返回第一行,而在GLSL中,则会返回第一列。,当你用“本来的”的命令初始化成员的时候,这同样也适用于构造函数。
1.7 其他异函数
HLSL | GLSL |
---|---|
atan2(y,x) | atan 使用参数交换 |
ddx | dFdx |
ddx_coarse | dFdxCoarse |
ddx_fine | dFdxFine |
ddy | dFdy |
ddy_coarse | dFdyCoarse |
ddy_fine | dFdyFine |
EvaluateAttributeAtCentroid | interpolateAtCentroid |
EvaluateAttributeAtSample | interpolateAtSample |
EvaluateAttributeSnapped | interpolateAtOffset |
frac | fract |
lerp | mix |
mad | fma |
saturate | clamp(x, 0.0, 1.0) |
二、相同之处
2.1 公有函数
函数名 | 用法 | 详述 |
---|---|---|
abs | abs(x) | 返回x的绝对值。对x的每个元素都会独立计算一次。Absolute value (per component). |
acos | acos(x) | 返回x的反余弦值。对x的每个元素都会独立计算一次。Returns the arccosine of each component of x. |
all | all(x) | 检测x的所有元数的值是否为0.Test if all components of x are nonzero. |
any | any(x) | 检测x是否有某个元数的值为0.Test if any component of x is nonzero. |
asfloat | asfloat(x) | 将x转换为float类型。Convert the input type to a float. |
asin | asin(x) | 返回x的反正弦值。对x的每个元素都会独立计算一次。 |
asint | asint(x) | 将x转换为int类型。Convert the input type to an integer. |
asuint | asuint(x) | 将x转换为uint类型。 |
atan | atan(x) | 返回x的反正切值。 |
atan2 | atan2(y, x) | 返回y、x的反正切值。 |
ceil | ceil(x) | 返回大于或等于x的最小整数。 |
clamp | clamp(x, min, max) | 将x截取在[min, max]范围内。 |
clip | clip(x) | 如果x中存在值小于0的参数,则丢弃当前像素。 |
cos | cos(x) | 返回x的余弦值。 |
cosh | cosh(x) | 返回x的双曲余弦值。 |
cross | cross(x, y) | 返回x、y的叉积。 |
D3DCOLORtoUBYTE4 | D3DCOLORtoUBYTE4(x) | 混合和缩放4D向量x用于补偿一些对UBYTE4支持的硬件。Swizzles and scales components of the 4D vector x to compensate for the lack of UBYTE4 support in some hardware. |
ddx | ddx(x) | 返回关于屏幕坐标x轴的偏导数。 |
ddy | ddy(x) | 返回关于屏幕坐标y轴的偏导数。 |
degrees | degrees(x) | 将x(弧度)转换到角度。 |
determinant | determinant(m) | 返回的正方形矩阵m的行列式。 |
distance | distance(x, y) | 返回x、y之间的距离。 |
dot | dot(x, y) | 返回x、y的点积。 |
exp | exp(x) | 返回以e为底数,x为指数的指数函数值。 |
exp2 | exp2(x) | 返回以2为底数,x为指数的指数函数值。对x的每个字段都会计算一次。 |
faceforward | faceforward(n, i, ng) | 检测多边形是否位于正面。-n * sign(•(i, ng))。 |
floor | floor(x) | 返回小于等于x的最大整数。 |
fmod | fmod(x, y) | 返回x/y的浮点余数。 |
frac | frac(x) | 返回x的小数部分。 |
frexp | frexp(x, exp) | 返回x的尾数和指数。 |
fwidth | fwidth(x) | 返回 abs(ddx(x)) + abs(ddy(x)), |
GetRenderTargetSampleCount | GetRenderTargetSampleCount() | 返回渲染目标采样器的个数。Returns the number of render-target samples. |
GetRenderTargetSamplePosition | GetRenderTargetSamplePosition(x) | 返回关于给定采样器的一个采样点(x,y)。Returns a sample position (x,y) for a given sample index. |
isfinite | isfinite(x) | 如果x为有限值则返回true,否则返回false。 |
isinf | isinf(x) | 如果x为无限值则返回true,否则返回false。 |
isnan | isnan(x) | 如果x为NAN或QNAN则返回true,否则返回false。 |
ldexp | ldexp(x, exp) | frexp的逆运算,返回 x * 2 ^ exp。 |
length | length(v) | 返回v向量的长度。 |
lerp | lerp(x, y, s) | 对x、y进行插值计算。Returns x + s(y - x)。 |
lit | lit(n • l, n • h, m) | 返回光照向量(环境光,漫反射光,镜面高光,1)。 |
log | log(x) | 返回以e为底的对数。 |
log10 | log10(x) | 返回以10为底的对数。 |
log2 | log2(x) | 返回以2为底的对数。 |
max | max(x, y) | 返回x、y中较大值。 |
min | min(x, y) | 返回x、y中较小值。 |
modf | modf(x, out ip) | 把x分割为整数和小数部分。 |
mul | mul(x, y) | 返回x、y矩阵相乘的积。 |
noise | noise(x) | Generates a random value using the Perlin-noise algorithm. |
normalize | normalize(x) | 返回单位化向量,定义为 x / length(x)。 |
pow | pow(x, y) | 返回x^y。 |
radians | radians(x) | 将x(角度)转换到弧度。 |
reflect | reflect(i, n) | 返回入射光线i对表面法线n的反射光线。 |
refract | refract(i, n, R) | 返回在入射光线i,表面法线n,折射率为R下的折射光线。 |
round | round(x) | 返回最接近x的整数。 |
rsqrt | rsqrt(x) | 返回x平方根的倒数。 1 / sqrt(x) 。 |
saturate | saturate(x) | 把x截取在[0, 1]之间。 |
sign | sign(x) | 返回x的符号。 |
sin | sin(x) | 返回x的正弦值。 |
sincos | sincos(x, out s, out c) | 返回x的正弦值和余弦值。 |
sinh | sinh(x) | 返回x的双曲正弦值。 |
smoothstep | smoothstep(min, max, x) | 如果x的范围是[min, max],则返回一个介于0和1之间的Hermite插值。 |
sqrt | sqrt(x) | 返回x的平方根,对x的每个字段都会计算一次。 |
step | step(a, x) | 返回 (x >= a) ? 1 : 0 。 |
tan | tan(x) | 返回x的正切值。 |
tanh | tanh(x) | 返回x的双曲正切值。 |
tex1D | tex1D(s, t) | 返回纹理s在t位置的颜色。1D texture lookup. |
tex1Dbias | tex1Dbias(s, t) | 使用bias返回纹理s在t位置的颜色。1D texture lookup with bias. |
tex1Dgrad | tex1Dgrad(s, t, ddx, ddy) | 1D texture lookup with a gradient. |
tex1Dlod | tex1Dlod(s, t) | 使用LOD返回纹理s在t位置的颜色。1D texture lookup with LOD. |
tex1Dproj | tex1Dproj(s, t) | 使用透视分离返回纹理s在t位置的颜色。1D texture lookup with projective divide. |
tex2D | tex2D(s, t) | 返回纹理s在t位置的颜色。 |
tex2Dbias | tex2Dbias(s, t) | 2D texture lookup with bias. |
tex2Dgrad | tex2Dgrad(s, t, ddx, ddy) | 2D texture lookup with a gradient. |
tex2Dlod | tex2Dlod(s, t) | 2D texture lookup with LOD. |
tex2Dproj | tex2Dproj(s, t) | 2D texture lookup with projective divide. |
tex3D | tex3D(s, t) | 3D texture lookup. |
tex3Dbias | tex3Dbias(s, t) | 3D texture lookup with bias. |
tex3Dgrad | tex3Dgrad(s, t, ddx, ddy) | 3D texture lookup with a gradient. |
tex3Dlod | tex3Dlod(s, t) | 3D texture lookup with LOD. |
tex3Dproj | tex3Dproj(s, t) | 3D texture lookup with projective divide. |
texCUBE | texCUBE(s, t) | Cube texture lookup. |
texCUBEbias | texCUBEbias(s, t) | Cube texture lookup with bias. |
texCUBEgrad | texCUBEgrad(s, t, ddx, ddy) | Cube texture lookup with a gradient. |
texCUBElod | tex3Dlod(s, t) | Cube texture lookup with LOD. |
texCUBEproj | texCUBEproj(s, t) | Cube texture lookup with projective divide. |
transpose | transpose(m) | 返回m的转置矩阵。 |
trunc | trunc(x) | 将x的所有元素从浮点值截断到整数值。 |
未完,后续用到再补充…
Shader_GLSL、HLSL API异同对比相关推荐
- asp.net 6中的mini api和mvc api性能对比
在.net6发布时,带来了一个新的模板框架,mini api,那与之前的mvc api性能对比是什么样的呢? 建了基于.net 6的两种模板项目,都实现了一个get /test01的api请求,代码如 ...
- C#索引器的实现、索引器和属性的异同对比,这些技能你get到了嘛?
目录 什么是索引器? 如何声明索引器? 索引器和属性的异同对比 索引器实例分析 Hello!大家好,我是努力赚钱买生发水的灰小猿! 最近在用C#做开发的时候要用到索引函数,所以今天就在这里和小伙伴记录 ...
- Asp.Net中WebForm与MVC,Web API模式对比
webform,web mvc和web api都是asp.net官方的三套框架,想对比下三者的关系,查了下资料,web api跟web mvc基本同属一脉,只是mvc多了一个视图渲染,网上有些博客介绍 ...
- 获取电子面单号的API接口对比(中通、快宝、菜鸟)
什么是电子面单 标准定义:电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务. 通俗定义:快递行业,上面标记有发件人/收件人信息及地址,三段码,物品信息等的一张贴纸,贴在包裹上:派件签收等都可以依 ...
- 孢子java_孢子框架-接口访问层、ESB、微服务API GateWay对比
标签: 如果从百度去搜索"接口访问层"你会发现主要是.NET里面的技术,叫做IDAL,其实是数据访问层接口.它的主要作用是兼容多种数据库.比如你定义一个标准接口,然后实现改接口的S ...
- 机器学习入门 --- LDA与PCA算法(公式推导、纯python代码实现、scikit-learn api调用对比结果)
为什么要做降维: 提高计算效率 留存有用的特征,为后续建模使用 在项目中实际拿到的数据,可能会有几百个维度(特征)的数据集,这样的数据集在建模使用时,非常消耗计算资源,所以需要通过使用降维方法来优化数 ...
- 车型识别API调用对比
一.艾科瑞特API 地址:https://market.aliyun.com/products/57124001/cmapi032754.html 价格:较贵2008元/10000次,车型识别近期更新 ...
- API网关对比与选择
Netflix Zuul GitHub : https://github.com/spring-cloud/spring-cloud-netflix zuul已经进入维护模式,详情见:https:// ...
- RHI_Shader Compare(HLSL、GLSL、MSL 、WGSL、OpenCL) Debug All
为了后续平台能够更好的封装跨平台Shader,本部分主要来看一下各平台Shader的语法特点.编译方式以及Debug方式等对比. 对于各类Shader语言还是先来看一下官方的文档,里边有具体的阐述,也 ...
最新文章
- ADO.NET与ORM的比较(5):MyBatis实现CRUD
- 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
- 《数据中台实战》:数据中台的分层建模体系
- 关于Delphi中TRttiContext.FindType失效的问题
- wamp中的index.php,codeigniter – 如何删除Wamp中的index.php?
- docker remote api未授权访问漏洞(端口:2375)
- 电脑自动安装软件、各种弹窗广告、中病毒等问题解决方案
- 一个简单的form表单登录界面
- 测试显示器分辨率和尺寸
- iRingg 1.0.48 iPhone铃声制作
- 微信开发者工具小技巧——快速创建小程序的新页面。
- 小米6刷Android10以及Xposed
- 2-管理Audio焦点(Managing Audio Playback)
- vue 使用vue-canvas-poster生成自定义海报
- esp32 + tft +分光棱镜 透明小电视笔记
- 牛客练习赛60C 操作集锦(DP)
- Kubernetes(k8s)之Volume(卷)
- 三井化学将扩大LUCANT™产能
- IOS开发系列—Objective-C之内存管理
- CSS网页布局之传统解决方案与Flex大法
热门文章
- npm包管理的一个小错误, No repository field,No description
- 【巧用自带清空内存命令 一键释放内存资源】
- 晋升项目经理一个月,我想离职.........
- 刘晓燕《不就是语法和长难句吗》第一章个人笔记
- 常用传感器讲解十一--light cup(KY-027)
- 一个简单的在线md5验证工具的实现
- 字符串匹配 KMP算法 C++
- 深入浅出C语言:(四)函数
- 基于蜉蝣优化算法的函数寻优算法
- 神七激励中国大国雄心 dabmolo