GLSL-to-HLSL 參考- UWP applications | Microsoft Docs

文章推薦指數: 80 %
投票人數:10人

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(typedefvectorvector;)的類型。

如需詳細資訊,請參閱使用者定義的類型。

矩陣類型 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 您也可使用矩陣類型來定義矩陣。

例如,matrixfMatrix={0.0f,0.1,2.1f,2.2f}; 矩陣也是定義為float4x4(typedefmatrixmatrix;)的類型。

如需詳細資訊,請參閱使用者定義的類型。

適用於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     本文內容



請為這篇文章評分?