Mapping between HLSL and GLSL
원문링크 : https://anteru.net/blog/2016/mapping-between-HLSL-and-GLSL/
System values & built-in inputs
Direct3D는 몇 가지 시스템 값을 지정하고 GLSL에는 내장 변수 개념이 있다. 매핑은 아래와 같다
HLSL | GLSL |
SV_ClipDistance | gl_ClipDistance |
SV_CullDistance | gl_CullDistance if ARB_cull_distance is present |
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 | gl_LocalInvocationIndex |
SV_GroupThreadID | gl_LocalInvocationID |
SV_GSInstanceID | gl_InvocationID |
SV_InsideTessFactor | gl_TessLevelInner |
SV_InstanceID | gl_InstanceID & gl_InstanceIndex (latter in Vulkan with different semantics) |
SV_IsFrontFace | gl_FrontFacing |
SV_OutputControlPointID | gl_InvocationID |
N/A | gl_PatchVerticesIn |
SV_Position | gl_Position in a vertex shader, gl_FragCoord in a fragment shader |
SV_PrimitiveID | gl_PrimitiveID |
SV_RenderTargetArrayIndex | gl_Layer |
SV_SampleIndex | gl_SampleID |
The equivalent functionality is available through EvaluateAttributeAtSample | gl_SamplePosition |
SV_StencilRef | gl_FragStencilRef if ARB_shader_stencil_export is present |
SV_Target | layout(location=N) out your_var_name; |
SV_TessFactor | gl_TessLevelOuter |
SV_VertexID | gl_VertexID & gl_VertexIndex (latter Vulkan with different semantics) |
SV_ViewportArrayIndex | gl_ViewportIndex |
이표는 OpenGL wiki, the HLSL semantic documentation and the GL_KHR_vulkan_glsl 을 참조
Atomic operations
InterlockedAdd는 atomicAdd가 되는 식이며, 유일한 차이점은 atomicCompSwap으로 바뀌는 InterlockedCompareExchange.
Shared/local memory
HLSL의 groupshared 메모리는 GLSL의 shared memory. 그게 전부임
Barriers
HLSL | GLSL |
GroupMemoryBarrierWithGroupSync | groupMemoryBarrier and barrier |
GroupMemoryBarrier | groupMemoryBarrier |
DeviceMemoryBarrierWithGroupSync | memoryBarrier, memoryBarrierImage, memoryBarrierImage and barrier |
DeviceMemoryBarrier | memoryBarrier, memoryBarrierImage, memoryBarrierImage |
AllMemoryBarrierWithGroupSync | All of the barriers above and barrier |
AllMemoryBarrier | All of the barriers above |
N/A | memoryBarrierShared |
Texture access
Vulkan 이전에는 번들로 제공되며 에뮬레이트하기가 쉽지 않다(not trivial to emulate). 다행히도 이것은 문법이 HLSL과 동일한 Vulkan에서 변경된다. 주요 차이점은 HLSL에서 액세스 방법이 "texture object"의 일부인 반면 GLSL에서는 자유함수(free function)라는 것이다. HLSL에서는 다음과 같이 Sampler라는 샘플러를 사용하여 Texture라는 텍스처를 샘플링한다.
Texture.Sample (Sampler, coordinate)
GLSL에서는 텍스처의 유형과 샘플러를 지정해야 하지만, 비슷하다.
texture (sampler2D(Texture, Sampler), coordinate)
HLSL | GLSL |
CalculateLevelOfDetail & CalculateLevelOfDetailUnclamped | textureQueryLod |
Load | texelFetch and texelFetchOffset |
GetDimensions | textureSize, textureQueryLevels and textureSamples |
Gather | textureGather, textureGatherOffset, textureGatherOffsets |
Sample, SampleBias | texture, textureOffset |
SampleCmp | samplerShadow |
SampleGrad | textureGrad, textureGradOffset |
SampleLevel | textureLod, textureLodOffset |
N/A | textureProj |
HLSL GLSL
General math
GLSL과 HLSL은 기본 행렬 해석이 다르다. GLSL은 열 우선을 가정하고 오른쪽의 곱셈(즉, M∗vM * vM∗v 적용) 및 HLSL은 왼쪽부터의 곱셈(v∗Mv * Mv∗M)을 가정. 일반적으로 무시할 수 있지만 재정의할 수 있다. 순서를 지정하고 원하는 쪽에서 곱하면 m이 행렬인 m[0]의 의미가 변경된다. HLSL에서는 첫 번째 행, GLSL에서는 첫 번째 열을 반환하게 된다. 이는 또한 "자연스러운" 순서로 멤버를 초기화하는 생성자로 확장.
Various functions
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) |
'Technical Report > Graphics Tech Reports' 카테고리의 다른 글
[번역]Terrain in Battlefield 3:A modern, complete and scalable system. GDC 2012 - 진행중 (0) | 2022.02.25 |
---|---|
[번역]Forward vs Deferred vs Forward+ Rendering with DirectX 11(1) Forward Rendering (0) | 2022.02.21 |
[번역]Occluders : Blocking the player (0) | 2022.01.12 |
[번역]Unity(및 기타 프로그램)를 위한 완벽한 노멀 맵 생성 (0) | 2022.01.07 |
GPU Specification compare PS5/XBOX Series X/Adreno/PC (0) | 2022.01.03 |