工作中,常常使用到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异同对比相关推荐

  1. asp.net 6中的mini api和mvc api性能对比

    在.net6发布时,带来了一个新的模板框架,mini api,那与之前的mvc api性能对比是什么样的呢? 建了基于.net 6的两种模板项目,都实现了一个get /test01的api请求,代码如 ...

  2. C#索引器的实现、索引器和属性的异同对比,这些技能你get到了嘛?

    目录 什么是索引器? 如何声明索引器? 索引器和属性的异同对比 索引器实例分析 Hello!大家好,我是努力赚钱买生发水的灰小猿! 最近在用C#做开发的时候要用到索引函数,所以今天就在这里和小伙伴记录 ...

  3. Asp.Net中WebForm与MVC,Web API模式对比

    webform,web mvc和web api都是asp.net官方的三套框架,想对比下三者的关系,查了下资料,web api跟web mvc基本同属一脉,只是mvc多了一个视图渲染,网上有些博客介绍 ...

  4. 获取电子面单号的API接口对比(中通、快宝、菜鸟)

    什么是电子面单 标准定义:电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务. 通俗定义:快递行业,上面标记有发件人/收件人信息及地址,三段码,物品信息等的一张贴纸,贴在包裹上:派件签收等都可以依 ...

  5. 孢子java_孢子框架-接口访问层、ESB、微服务API GateWay对比

    标签: 如果从百度去搜索"接口访问层"你会发现主要是.NET里面的技术,叫做IDAL,其实是数据访问层接口.它的主要作用是兼容多种数据库.比如你定义一个标准接口,然后实现改接口的S ...

  6. 机器学习入门 --- LDA与PCA算法(公式推导、纯python代码实现、scikit-learn api调用对比结果)

    为什么要做降维: 提高计算效率 留存有用的特征,为后续建模使用 在项目中实际拿到的数据,可能会有几百个维度(特征)的数据集,这样的数据集在建模使用时,非常消耗计算资源,所以需要通过使用降维方法来优化数 ...

  7. 车型识别API调用对比

    一.艾科瑞特API 地址:https://market.aliyun.com/products/57124001/cmapi032754.html 价格:较贵2008元/10000次,车型识别近期更新 ...

  8. API网关对比与选择

    Netflix Zuul GitHub : https://github.com/spring-cloud/spring-cloud-netflix zuul已经进入维护模式,详情见:https:// ...

  9. RHI_Shader Compare(HLSL、GLSL、MSL 、WGSL、OpenCL) Debug All

    为了后续平台能够更好的封装跨平台Shader,本部分主要来看一下各平台Shader的语法特点.编译方式以及Debug方式等对比. 对于各类Shader语言还是先来看一下官方的文档,里边有具体的阐述,也 ...

最新文章

  1. ADO.NET与ORM的比较(5):MyBatis实现CRUD
  2. 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
  3. 《数据中台实战》:数据中台的分层建模体系
  4. 关于Delphi中TRttiContext.FindType失效的问题
  5. wamp中的index.php,codeigniter – 如何删除Wamp中的index.php?
  6. docker remote api未授权访问漏洞(端口:2375)
  7. 电脑自动安装软件、各种弹窗广告、中病毒等问题解决方案
  8. 一个简单的form表单登录界面
  9. 测试显示器分辨率和尺寸
  10. iRingg 1.0.48 iPhone铃声制作
  11. 微信开发者工具小技巧——快速创建小程序的新页面。
  12. 小米6刷Android10以及Xposed
  13. 2-管理Audio焦点(Managing Audio Playback)
  14. vue 使用vue-canvas-poster生成自定义海报
  15. esp32 + tft +分光棱镜 透明小电视笔记
  16. 牛客练习赛60C 操作集锦(DP)
  17. Kubernetes(k8s)之Volume(卷)
  18. 三井化学将扩大LUCANT™产能
  19. IOS开发系列—Objective-C之内存管理
  20. CSS网页布局之传统解决方案与Flex大法

热门文章

  1. npm包管理的一个小错误, No repository field,No description
  2. 【巧用自带清空内存命令 一键释放内存资源】
  3. 晋升项目经理一个月,我想离职.........
  4. 刘晓燕《不就是语法和长难句吗》第一章个人笔记
  5. 常用传感器讲解十一--light cup(KY-027)
  6. 一个简单的在线md5验证工具的实现
  7. 字符串匹配 KMP算法 C++
  8. 深入浅出C语言:(四)函数
  9. 基于蜉蝣优化算法的函数寻优算法
  10. 神七激励中国大国雄心 dabmolo