前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HLSL 与 GLSL 之间的映射关系参考[通俗易懂]

HLSL 与 GLSL 之间的映射关系参考[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-14 11:05:02
1.8K0
发布2022-09-14 11:05:02
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

系统参数与內建的输入参数

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)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159800.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档