GLSL Half(浮点)属性类型

时间:2017-06-16 17:44:03

标签: opengl glsl

我一直试图将一个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,所以它应该支持一半?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:5)

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将包括透明属性精度转换。用户上传例如完全合法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命名空间另外,全部   标识符