GLSL Half(浮点)属性类型

Cha*_*mon 0 opengl glsl

我一直试图将一个16位浮点(半浮点)作为属性放入我的GLSL顶点着色器.它不会让我编译说:

error C7506: OpenGL does not define the global type half
Run Code Online (Sandbox Code Playgroud)

但我的#version410,所以它应该支持一半?我错过了一些明显的东西吗

sol*_*xel 6

OpenGL和OpenGL ES定义了两种并发类型的精度.

  • 缓冲区中的存储精度
  • 着色器中使用的最小计算精度.

存储精度由您的顶点属性上传定义,例如GL_FLOATGL_HALF_FLOAT.这将是用于将数据存储在内存中的精度.

使用精度在着色器中定义为highp(至少32位),mediump(至少16位)和lowp(至少9位).这些是最小精度; 为着色器指定变量mediump以及着色器编译器生成fp32数据类型是完全合法的.桌面图形芯片往往只支持FP32运算,所以使用的highp,mediump并且lowp都映射到FP32数据类型(精度预选赛只包含跟上的OpenGL ES着色器的兼容性,并可以依法由编译器被忽略).实现OpenGL ES的移动GPU往往会映射highp到FP32,并mediumplowp到FP16.有关详细信息,请参阅GLSL ES 3.0规范的4.5.1节

当绑定在内存中的输入变量的着色器的储存和使用精度被一个顶点属性要求相匹配; API将包括透明属性精度转换.用户上传例如a GL_FLOAT然后在着色器中将其mediump用作fp16变量是完全合法的,尽管这样做会浪费内存带宽.