我一直试图将一个16位浮点(半浮点)作为属性放入我的GLSL顶点着色器中。它不会让我编译说:
hideNewListener = scope.$on('hide-new', function (event, next, current) {
hideNew(element, function () {
scope.$emit('changeRoute');
hideNewListener();
});
});
但我的error C7506: OpenGL does not define the global type half
是#version
,所以它应该支持一半?我错过了一些明显的东西吗?
答案 0 :(得分:5)
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将包括透明属性精度转换。用户上传例如完全合法a GL_FLOAT
然后在着色器中将其用作mediump
fp16变量,尽管这样做会浪费内存带宽。
答案 1 :(得分:3)
在没有MCVE证明的情况下,我认为你尝试了类似的东西:
half float aHalfFloat;
然而," half
"是#version 410
中的保留关键字:
OpenGL Shading Language 4.10 Specification,第15页(强调我的):
以下是保留供将来使用的关键字。 使用它们 将导致错误:
common partition active asm class union enum typedef template this 打包goto inline noinline volatile public static extern external 接口长短半固定无符号超级输入输出hvec2 hvec3 hvec4 fvec2 fvec3 fvec4 sampler3DRect filter image1D image2D image3D imageCube iimage1D iimage2D iimage3D iimageCube uimage1D uimage2D uimage3D uimageCube image1DArray image2DArray iimage1DArray iimage2DArray uimage1DArray uimage2DArray image1DShadow image2DShadow image1DArrayShadow image2DArrayShadow imageBuffer iimageBuffer 使用row_major的uimageBuffer sizeof cast命名空间另外,全部 标识符