大家好,又见面了,我是你们的朋友全栈君。
系统参数与內建的输入参数
Direct3D有很多系统参数,而相应的,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
在顶点着色器中gl_Position
在片元着色器中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
此表来源于OpenGL维基百科,HLSL语义文档以及GL_KHR_vulkan_glsl扩展规范。
原子操作
原子操作的对应关系非常简单。将Interlocked换成atomic。因此InterlockedAdd则替换成atomicAdd,以此类推。唯一的区别就是InterlockedCompareExchange要换成atomicCompSwap。
共享/本地内存
HLSL中的groupshared 内存就是GLSL中的shared 内存。仅此而已。
内存屏障
HLSL
GLSL
GroupMemoryBarrierWithGroupSync
groupMemoryBarrier
和 barrier
GroupMemoryBarrier
groupMemoryBarrier
DeviceMemoryBarrierWithGroupSync
memoryBarrier, memoryBarrierImage, memoryBarrierImage和barrier
AllMemoryBarrierWithGroupSync
上面所有的内存栅栏 和 barrier
AllMemoryBarrier
上面所有的内存栅栏
N/A
memoryBarrierShared
纹理访问
在没有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
基本数学函数
GLSL和HLSL对默认矩阵阐释有所不同。GLSL使用列优先右乘矩阵(也就是,你用的是 M * v),HLSL使用行优先左乘矩阵(v * M)然而你通常可以忽略这些-你可以重载这个命令,使之可以在左右两边都能进行乘法 –这将会改变矩阵m中m[0]的含义。在HLSL中,将返回第一行,而在GLSL中,则会返回第一列。,当你用“本来的”的命令初始化成员的时候,这同样也适用于构造函数。
各种函数
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)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159800.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...