GLSL-to-HLSL 參考- UWP applications | Microsoft Docs
文章推薦指數: 80 %
gl_FrontFacing. 此變數為bool 類型。
決定片段是否屬於面向前方的基本型別。
SV_IsFrontFace. Direct3D 9 中的VFACE. SV_IsFrontFace 為bool 類型。
跳到主要內容
已不再支援此瀏覽器。
請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。
下載MicrosoftEdge
其他資訊
目錄
結束焦點模式
閱讀英文
儲存
目錄
閱讀英文
儲存
Twitter
LinkedIn
Facebook
電子郵件
WeChat
目錄
GLSL-to-HLSL參考
發行項
04/02/2022
4位參與者
此頁面有所助益嗎?
Yes
No
還有其他意見反應嗎?
系統會將意見反應傳送給Microsoft:按下[提交]按鈕,您的意見反應將用來改善Microsoft產品和服務。
隱私權原則。
送出
謝謝。
本文內容
當您將圖形架構從OpenGLES2.0移植到Direct3D11以建立通用Windows平台(UWP)遊戲時,也必須將OpenGL著色器語言(GLSL)程式碼移植到Microsoft高階著色器語言(HLSL)程式碼。
這裡所指的GLSL是與OpenGLES2.0相容;HLSL則與Direct3D11相容。
如需Direct3D11與舊版Direct3D之間差異的相關資訊,請參閱功能對應。
比較OpenGLES2.0與Direct3D11
將GLSL變數移植到HLSL
將GLSL類型移植到HLSL
將GLSL預先定義的全域變數移植到HLSL
將GLSL變數移植到HLSL的範例
GLSL中的uniform、attribute與varying
HLSL中的常數緩衝區與資料傳輸
將OpenGL轉譯程式碼移植到Direct3D的範例
相關主題
比較OpenGLES2.0與Direct3D11
OpenGLES2.0與Direct3D11有許多相似處。
它們都有類似的轉譯管線與圖形功能。
但Direct3D11是轉譯實作與API,並非規格;OpenGLES2.0則是轉譯規格與API,而非實作方式。
一般來說,Direct3D11與OpenGLES2.0的差異如下:
OpenGLES2.0
Direct3D11
硬體與作業系統無從驗證的規格與廠商提供的實作
Microsoft的硬體抽象實作與Windows平台上的憑證
抽象的硬體多樣性;執行階段管理多數資源
直接存取硬體配置;應用程式可管理資源並進行處理
透過協力廠商程式庫(例如,簡易直接媒體層(SDL))提供較高階的模組
在較低階的模組上建置Direct2D這類較高階的模組,簡化Windows應用程式的開發
透過擴充功能展現硬體廠商差異性
Microsoft以一般方式將選用功能新增至API,因此不會專屬於特定硬體廠商
一般來說,GLSL與HLSL的差異如下:
程序性的,注重步驟(類似C)
以物件為導向,注重資料(類似C++)
著色器編譯整合至圖形API
在Direct3D將著色器傳遞到驅動程式之前,HLSL編譯器會先將著色器編譯至中繼的二進位表示法。
注意此二進位標記法與硬體無關。
通常會在app建置時進行編譯,而不是在app執行時進行編譯。
Variable儲存區修飾詞
透過輸入配置宣告傳輸常數緩衝區與資料
類型
典型的向量類型:vec2/3/4
lowp、mediump、highp
典型的向量類型:float2/3/4
min10float、min16float
texture2D[Function]
texture.Sample[datatype.Function]
sampler2D[datatype]
Texture2D[datatype]
以列為主的矩陣(預設值)
以欄為主的矩陣(預設值)
注意使用row_major類型修飾詞來變更某個變數的版面配置。
如需詳細資訊,請參閱變數語法。
您也可指定編譯器旗標或pragma來變更全域預設值。
片段著色器
像素著色器
注意HLSL具有材質和取樣器作為兩個不同的物件。
在GLSL(如Direct3D9)中,紋理繫結為取樣器狀態的一部分。
在GLSL中,您將大部分的OpenGL狀態呈現為預先定義的全域變數。
例如,使用GLSL時,您可以使用gl_Position變數來指定頂點位置,並使用gl_FragColor變數來指定片段色彩。
在HLSL中,您明確將Direct3D狀態從app程式碼傳遞至著色器。
例如,使用Direct3D與HLSL時,頂點著色器的輸入必須符合頂點緩衝區中的資料格式,而應用程式程式碼中的常數緩衝區結構必須符合著色器程式碼中的常數緩衝區(cbuffer)結構。
將GLSL變數移植到HLSL
在GLSL中,您將修飾詞(限定詞)套用到全域著色器變數宣告,讓變數在您的著色器中擁有特定的行為。
在HLSL則不需要這些修飾詞,因為您使用傳遞至著色器並從著色器所傳回的引數來定義著色器流程。
uniform
您將uniform變數從app程式碼傳遞至頂點與片段著色器內,或是其中之一。
使用這些著色器繪製任何三角形之前,您必須設定所有uniform的值,這樣在繪製三角形網格的整個過程中,它們的值才能維持相同。
這些值是uniform。
有些uniform是針對整個框架所設定,而其他則是特別針對某一組特殊頂點像素著色器而設定。
uniform變數是基於多邊形的變數。
使用常數緩衝區。
請參閱使用方法:建立常數緩衝區與著色器常數。
不同
您在頂點著色器內初始化varying變數,並將它傳遞至片段著色器中擁有相同名稱的varying變數。
因為頂點著色器只設定每個頂點的varying變數值,因此點陣化會插補這些值(以透視修正方式)來產生每個片段值,以傳遞至片段著色器。
這些變數在每個三角形都不同。
使用從頂點著色器傳回的結構做為像素著色器的輸入。
請確定語意值相符。
屬性
attribute是您單獨從app程式碼傳遞至頂點著色器之頂點描述的一部分。
與uniform不同,您要為每個頂點設定各個attribute的值,然後每個頂點便有不同的值。
Attribute變數是基於頂點的變數。
在Direct3D應用程式程式碼中定義頂點緩衝區,並使它與頂點著色器中定義的頂點輸入相符。
您可選擇是否定義索引緩衝區。
請參閱使用方法:建立頂點緩衝區與使用方法:建立索引緩衝區。
在Direct3D應用程式程式碼中建立輸入配置,並使語意值與頂點輸入中的語意值相符。
請參閱建立輸入配置。
const
編譯至著色器且永不會變更的常數。
請使用staticconst。
static表示此值未針對常數緩衝區公開,const表示著色器無法變更此值。
因此,根據值的初始設定式,會於編譯時識別它。
在GLSL,沒有修飾詞的變數只是每個著色器私有的一般全域變數。
當您將資料傳遞至紋理(HLSL中的Texture2D)以及其關聯的取樣器(HLSL中的SamplerState)時,通常會將它們宣告為像素著色器中的全域變數。
將GLSL類型移植到HLSL
使用此表格將GLSL類型移植到HLSL。
純量類型:float、int、bool
純量類型:float、int、bool
還有uint、double
如需詳細資訊,請參閱純量類型。
向量類型
浮點向量:vec2、vec3、vec4
布林值向量:bvec2、bvec3、bvec4
帶正負號的整數向量:ivec2、ivec3、ivec4
向量類型
float2、float3、float4與float1
bool2、bool3、bool4與bool1
int2、int3、int4與int1
這些類型也有類似於float、bool與int的向量擴充:
uint
min10float、min16float
min12int、min16int
min16uint
如需詳細資訊,請參閱向量類型與關鍵字。
向量也是定義為float4(typedefvector
如需詳細資訊,請參閱使用者定義的類型。
矩陣類型
mat2:2x2浮點數矩陣
mat3:3x3浮點數矩陣
mat4:4x4浮點數矩陣
矩陣類型
float2x2
float3x3
float4x4
還有float1x1、float1x2、float1x3、float1x4、float2x1、float2x3、float2x4、float3x1、float3x2、float3x4、float4x1、float4x2、float4x3
這些類型也有類似於float的矩陣擴充:
int、uint、bool
min10float、min16float
min12int、min16int
min16uint
您也可使用矩陣類型來定義矩陣。
例如,matrix
如需詳細資訊,請參閱使用者定義的類型。
適用於float、int、取樣器的精確度限定詞
highp
此限定詞提供的最小精確度需求大於min16float所提供的需求,且小於完整32位元浮點數。
HLSL中的對等項目為:
highpfloat->float
highpint->int
mediump
套用到float與int的這個限定詞相當於HLSL中的min16float與min12int。
最小10位元的mantissa,不像min10float。
lowp
套用至float的這個限定詞提供範圍從-2到2的浮點。
相當於HLSL中的min10float。
精確度類型
min16float:最小16位元浮點值
min10float
最小固定點帶正負號2.8位元值(2位元的整數與8位元的分數元件)。
8位元的分數元件可包含1而不排除,讓範圍完整包含從-2到2。
min16int:最小16位元帶正負號的整數
min12int:最小12位元帶正負號的整數
此類型適用於10Level9(9_x功能層級),其中整數由浮點數表示。
這會是您在使用16位元浮點數列舉整數時所得到的精確度。
min16uint:最小16位元不帶正負號的整數
如需詳細資訊,請參閱純量類型與使用HLSL最小精確度。
sampler2D
Texture2D
samplerCube
TextureCube
將GLSL預先定義的全域變數移植到HLSL
使用此表格將GLSL預先定義的全域變數移植到HLSL。
gl_Position
此變數為vec4類型。
頂點位置
例如-gl_Position=position;
SV_Position
Direct3D9中的POSITION
此語意為float4類型。
頂點著色器輸出
頂點位置
例如-float4vPosition:SV_Position;
gl_PointSize
此變數為float類型。
點大小
PSIZE
除非目標設為Direct3D9,否則無意義
此語意為float類型。
頂點著色器輸出
點大小
gl_FragColor
此變數為vec4類型。
片段色彩
例如-gl_FragColor=vec4(colorVarying,1.0);
SV_Target
Direct3D9中的COLOR
此語意為float4類型。
像素著色器輸出
像素色彩
例如-float4Color[4]:SV_Target;
gl_FragData[n]
此變數為vec4類型。
色彩附件n的片段色彩
SV_Target[n]
此語意為float4類型。
儲存在n轉譯目標的像素著色器輸出值,其中0<=n<=7。
gl_FragCoord
此變數為vec4類型。
框架緩衝區內的片段位置
SV_Position
Direct3D9中無法使用
此語意為float4類型。
像素著色器輸入
螢幕空間座標
例如-float4screenSpace:SV_Position
gl_FrontFacing
此變數為bool類型。
決定片段是否屬於面向前方的基本型別。
SV_IsFrontFace
Direct3D9中的VFACE
SV_IsFrontFace為bool類型。
VFACE為float類型。
像素著色器輸入
基本型別面向
gl_PointCoord
此變數為vec2類型。
點內的片段位置(僅限點陣化)
SV_Position
Direct3D9中的VPOS
SV_Position為float4類型。
VPOS為float2類型。
像素著色器輸入
螢幕空間中的像素或範本位置
例如-float4pos:SV_Position
gl_FragDepth
此變數為float類型。
深度緩衝區資料
SV_Depth
Direct3D9中的DEPTH
SV_Depth為float類型。
像素著色器輸出
深度緩衝區資料
您可使用語意來指定頂點著色器輸入與像素著色器輸入的位置、色彩等等。
您必須使輸入配置中的語意值與頂點著色器輸入相符。
如需範例,請參閱將GLSL變數移植到HLSL的範例。
如需HLSL語意的詳細資訊,請參閱語意。
將GLSL變數移植到HLSL的範例
這裡我們示範在OpenGL/GLSL程式碼中使用GLSL變數的範例,以及在Direct3D/HLSL程式碼中的相等範例。
GLSL中的uniform、attribute與varying
OpenGL應用程式程式碼
//Uniformvaluescanbesetinappcodeandthenprocessedintheshadercode.
uniformmat4model;
uniformmat4view;
uniformmat4projection;
//Incomingpositionofvertex
attributevec4position;
//Incomingcolorforthevertex
attributevec3color;
//Thevaryingvariabletellstheshaderpipelinetopassit
//ontothefragmentshader.
varyingvec3colorVarying;
GLSL頂點著色器程式碼
//Theshaderentrypointisthemainmethod.
voidmain()
{
colorVarying=color;//Usethevaryingvariabletopassthecolortothefragmentshader
gl_Position=position;//Copythepositiontothegl_Positionpre-definedglobalvariable
}
GLSL片段著色器程式碼
voidmain()
{
//PadthecolorVaryingvec3witha1.0foralphatocreateavec4color
//andassignthatcolortothegl_FragColorpre-definedglobalvariable
//Thiscolorthenbecomesthefragment'scolor.
gl_FragColor=vec4(colorVarying,1.0);
}
HLSL中的常數緩衝區與資料傳輸
以下範例說明如何將資料傳遞至HLSL頂點著色器,然後流向像素著色器。
在您的應用程式程式碼中,定義頂點與常數緩衝區。
然後,在頂點著色器程式碼中,將常數緩衝區定義為cbuffer,並儲存每一頂點資料與像素著色器輸入資料。
這裡我們使用名為VertexShaderInput與PixelShaderInput的結構。
Direct3Dapp程式碼
structConstantBuffer
{
XMFLOAT4X4model;
XMFLOAT4X4view;
XMFLOAT4X4projection;
};
structSimpleCubeVertex
{
XMFLOAT3pos;//position
XMFLOAT3color;//color
};
//Createaninputlayoutthatmatchesthelayoutdefinedinthevertexshadercode.
constD3D11_INPUT_ELEMENT_DESCbasicVertexLayoutDesc[]=
{
{"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
{"COLOR",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0},
};
//Createvertexandindexbuffersthatdefineageometry.
HLSL頂點著色器程式碼
cbufferModelViewProjectionCB:register(b0)
{
matrixmodel;
matrixview;
matrixprojection;
};
//ThePOSITIONandCOLORsemanticsmustmatchthesemanticsintheinputlayoutDirect3Dappcode.
structVertexShaderInput
{
float3pos:POSITION;//Incomingpositionofvertex
float3color:COLOR;//Incomingcolorforthevertex
};
structPixelShaderInput
{
float4pos:SV_Position;//Copythevertexposition.
float4color:COLOR;//Passthecolortothepixelshader.
};
PixelShaderInputmain(VertexShaderInputinput)
{
PixelShaderInputvertexShaderOutput;
//shadersourcecode
returnvertexShaderOutput;
}
HLSL像素著色器程式碼
//Collectinputfromthevertexshader.
//TheCOLORsemanticmustmatchthesemanticinthevertexshadercode.
structPixelShaderInput
{
float4pos:SV_Position;
float4color:COLOR;//Colorforthepixel
};
//Setthepixelcolorvaluefortherentertarget.
float4main(PixelShaderInputinput):SV_Target
{
returninput.color;
}
將OpenGL轉譯程式碼移植到Direct3D的範例
這裡我們示範在OpenGLES2.0程式碼中轉譯的範例,以及在Direct3D11程式碼中的相等範例。
OpenGL轉譯程式碼
//Bindshaderstothepipeline.
//Bothvertexshaderandfragmentshaderareinaprogram.
glUseProgram(m_shader->getProgram());
//Inputasssembly
//Getthepositionandcolorattributesofthevertex.
m_positionLocation=glGetAttribLocation(m_shader->getProgram(),"position");
glEnableVertexAttribArray(m_positionLocation);
m_colorLocation=glGetAttribColor(m_shader->getProgram(),"color");
glEnableVertexAttribArray(m_colorLocation);
//Bindthevertexbufferobjecttotheinputassembler.
glBindBuffer(GL_ARRAY_BUFFER,m_geometryBuffer);
glVertexAttribPointer(m_positionLocation,4,GL_FLOAT,GL_FALSE,0,NULL);
glBindBuffer(GL_ARRAY_BUFFER,m_colorBuffer);
glVertexAttribPointer(m_colorLocation,3,GL_FLOAT,GL_FALSE,0,NULL);
//Drawatrianglewith3vertices.
glDrawArray(GL_TRIANGLES,0,3);
Direct3D轉譯程式碼
//Bindthevertexshaderandpixelshadertothepipeline.
m_d3dDeviceContext->VSSetShader(vertexShader.Get(),nullptr,0);
m_d3dDeviceContext->PSSetShader(pixelShader.Get(),nullptr,0);
//Declaretheinputsthattheshadersexpect.
m_d3dDeviceContext->IASetInputLayout(inputLayout.Get());
m_d3dDeviceContext->IASetVertexBuffers(0,1,vertexBuffer.GetAddressOf(),&stride,&offset);
//Settheprimitive'stopology.
m_d3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
//Drawatrianglewith3vertices.triangleVerticesisanarrayof3vertices.
m_d3dDeviceContext->Draw(ARRAYSIZE(triangleVertices),0);
相關主題
從OpenGLES2.0移植到Direct3D11
本文內容
延伸文章資訊
- 1gl_FrontFacing - OpenGL 4 Reference Pages - Khronos Group
Available only in the fragment language, gl_FrontFacing is an input variable whose value is true ...
- 2GLSL-to-HLSL 參考- UWP applications | Microsoft Docs
gl_FrontFacing. 此變數為bool 類型。 決定片段是否屬於面向前方的基本型別。 SV_IsFrontFace. Direct3D 9 中的VFACE. SV_IsFrontFac...
- 3[SOLVED] Shader gl_FrontFacing parameter - PlayCanvas ...
You are accessing gl_FrontFacing in the vertex shader when you should instead do it in the fragme...
- 4OpenGL Programming Guide: The Official Guide to Learning ...
OpenGL Shading Language has a builtin Boolean variable gl_FrontFacing allowing you to do so. The ...
- 5高级GLSL
gl_FrontFacing. 片段着色器另一个有意思的输入变量是 gl_FrontFacing 变量。在面剔除教程中,我们提到过OpenGL可以根据 ...