2017-06-16 156 views
-1

我一直在嘗試將一個16位浮點(半浮點)作爲屬性放到我的GLSL頂點着色器中。它不會讓我編說:GLSL屬性類型的一半(浮點數)

error C7506: OpenGL does not define the global type half 

但我#version410,所以它應該支持半?我錯過了明顯的東西嗎?

+2

在[mcve]中編輯。 – genpfault

+1

您可以在頂點屬性中使用16位半浮點數,但不能在着色器中使用16位半浮點數。它們只會像其他任何非整數屬性類型一樣轉換爲32位浮點數。 – derhass

回答

3

在沒有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此外,所有 標識符

+0

所以我應該使用lowp浮點數? – ChaoSXDemon

+0

@ChaoSXDemon:不會做任何事情,請參閱第55頁底部的「4.5.2精度限定符」。 – genpfault

+0

所以我不能在16位使用16位浮點數作爲屬性? – ChaoSXDemon

2

的OpenGL和OpenGL ES定義兩個併發類型的精度。

  • 寄存精度緩衝器
  • 在着色器中使用最小的計算精度。

存儲精度由您的頂點屬性上傳來定義,如GL_FLOATGL_HALF_FLOAT。這將是用於將數據存儲在內存中的精度。

使用精確度是在着色器定義爲highp(至少32位),mediump(至少16位),和lowp(至少9位)。這些是最低精度;對於着色器來說,指定變量爲mediump並且着色器編譯器生成fp32數據類型是完全合法的。臺式機GPU往往只支持fp32計算,因此使用highpmediumplowp都映射到fp32數據類型(精度限定符僅用於保持與OpenGL ES着色器的兼容性,並且可以由編譯器合法忽略)。實現OpenGL ES的移動GPU傾向於將highp映射到fp32,將mediumplowp映射到fp16。 詳細信息可以在GLSL ES 3.0 Specification, Section 4.5.1

發現當在存儲器中的頂點屬性綁定到輸入着色器變量中的存儲和使用精度爲以匹配所需的; API將包含透明屬性精度轉換。例如,用戶上傳是完全合法的。一個GL_FLOAT然後在着色器中使用它作爲mediump fp16變量,但這樣做會浪費內存帶寬。