【问题标题】:GLSL Half (floating point) attribute typeGLSL Half(浮点)属性类型
【发布时间】:2017-06-16 17:44:02
【问题描述】:

我一直在尝试将 16 位浮点数(半浮点数)作为属性添加到我的 GLSL 顶点着色器中。它不会让我编译说:

error C7506: OpenGL does not define the global type half

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

【问题讨论】:

  • 您可以在顶点属性中使用 16 位半浮点数而不会出现任何问题,但您不能在着色器中使用 16 位半浮点数。它们将像任何其他非整数属性类型一样被转换为 32 位浮点数。

标签: opengl glsl


【解决方案1】:

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 变量,尽管这样做会浪费内存带宽。

【讨论】:

    【解决方案2】:

    在没有 MCVE 演示的情况下,我假设您尝试过类似的操作:

    half float aHalfFloat;
    

    但是,“half”是#version 410中的保留关键字:

    OpenGL Shading Language 4.10 Specification,第 15 页(重点是我的):

    以下是保留供将来使用的关键字。 使用它们 将导致错误

    公用分区活动asm类联合枚举typedef模板this 打包 goto inline noinline volatile public static extern external interface long short half 固定 unsigned 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 cast namespace using row_major 另外,所有 标识符

    【讨论】:

    • 所以我应该使用lowp float?
    • @ChaoSXDemon:这不会做任何事情,请参阅第 55 页底部的“4.5.2 精度限定符”。
    • 所以我不能在 410 中使用 16 位浮点数作为属性?
    • @ChaoSXDemon:可以使用 16 位浮点属性。但是你没有在着色器中指定 。就像着色器没有说属性是标准化整数或其他什么一样。在属性的基本类型(float、integer、uint、double)之外,确定格式的地方是in your glVertexAttrib*Format/Pointer call。它接受 16 位浮点数。
    • 这只是说 GPU 读取数据为半浮点值,the actual representation used within the shader program is still 32bit floats
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多