我一直在嘗試將一個16位浮點(半浮點)作爲屬性放到我的GLSL頂點着色器中。它不會讓我編說:GLSL屬性類型的一半(浮點數)
error C7506: OpenGL does not define the global type half
但我#version
爲410
,所以它應該支持半?我錯過了明顯的東西嗎?
我一直在嘗試將一個16位浮點(半浮點)作爲屬性放到我的GLSL頂點着色器中。它不會讓我編說:GLSL屬性類型的一半(浮點數)
error C7506: OpenGL does not define the global type half
但我#version
爲410
,所以它應該支持半?我錯過了明顯的東西嗎?
在沒有MCVE證明,否則我想你想是這樣:
half float aHalfFloat;
然而, 「half
」 是#version 410
保留關鍵字:
OpenGL Shading Language 4.10 Specification,第15頁(重點煤礦) :
以下是保留給將來使用的關鍵字。 使用它們 會導致錯誤:
常見的分區處於活動狀態的asm級工會枚舉類型定義模板,這 打包轉到在線noinline始終揮發性公共靜態外部外部 接口較長短半固定的無符號superp輸入輸出hvec2 hvec3 hvec4 fvec2 fvec3 fvec4 sampler3DRect過濾image1D image2D image3D imageCube iimage1D iimage2D iimage3D iimageCube uimage1D uimage2D uimage3D uimageCube image1DArray image2DArray iimage1DArray iimage2DArray uimage1DArray uimage2DArray image1DShadow image2DShadow image1DArrayShadow image2DArrayShadow ImageBuffer的iimageBuffer uimageBuffer的sizeof鑄造命名空間使用row_major此外,所有 標識符
所以我應該使用lowp浮點數? – ChaoSXDemon
@ChaoSXDemon:不會做任何事情,請參閱第55頁底部的「4.5.2精度限定符」。 – genpfault
所以我不能在16位使用16位浮點數作爲屬性? – ChaoSXDemon
的OpenGL和OpenGL ES定義兩個併發類型的精度。
存儲精度由您的頂點屬性上傳來定義,如GL_FLOAT
或GL_HALF_FLOAT
。這將是用於將數據存儲在內存中的精度。
使用精確度是在着色器定義爲highp
(至少32位),mediump
(至少16位),和lowp
(至少9位)。這些是最低精度;對於着色器來說,指定變量爲mediump
並且着色器編譯器生成fp32數據類型是完全合法的。臺式機GPU往往只支持fp32計算,因此使用highp
,mediump
和lowp
都映射到fp32數據類型(精度限定符僅用於保持與OpenGL ES着色器的兼容性,並且可以由編譯器合法忽略)。實現OpenGL ES的移動GPU傾向於將highp
映射到fp32,將mediump
和lowp
映射到fp16。 詳細信息可以在GLSL ES 3.0 Specification, Section 4.5.1
發現當在存儲器中的頂點屬性綁定到輸入着色器變量中的存儲和使用精度爲不以匹配所需的; API將包含透明屬性精度轉換。例如,用戶上傳是完全合法的。一個GL_FLOAT
然後在着色器中使用它作爲mediump
fp16變量,但這樣做會浪費內存帶寬。
在[mcve]中編輯。 – genpfault
您可以在頂點屬性中使用16位半浮點數,但不能在着色器中使用16位半浮點數。它們只會像其他任何非整數屬性類型一樣轉換爲32位浮點數。 – derhass