본문으로 바로가기
반응형

Mapping between HLSL and GLSL
원문링크 : https://anteru.net/blog/2016/mapping-between-HLSL-and-GLSL/

 

Mapping between HLSL and GLSL

 

anteru.net

 
 
HLSL과 GLSL의 차이만을 다루고 있다. 왼쪽이 HLSL 오른쪽이 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)
반응형