【问题标题】:(unsigned) byte in GLSLGLSL 中的(无符号)字节
【发布时间】:2017-08-02 03:31:36
【问题描述】:

我的一些顶点属性是单个无符号字节,我在我的 GLSL 片段着色器中需要它们,不是用于任何“真实”计算,而是用于比较它们(如果你愿意的话,就像枚举)。我在 GLSL 中没有找到任何无符号字节甚至字节数据类型,那么有没有办法将它用作输入?如果不是(目前看来是)GL_UNSIGNED_BYTE 的目的是什么?

【问题讨论】:

    标签: opengl types glsl byte unsigned


    【解决方案1】:

    GLSL 不处理大小类型(嗯,不是小于 32 位的大小类型)。它只有有符号/无符号整数、浮点数、双精度数、布尔值和它们的向量/矩阵。如果将无符号字节作为整数顶点属性传递给顶点着色器,则它可以将其读取为 uint 类型,大小为 32 位。传递整数属性需要使用glVertexAttribIPointer/IFormat(注意“I”)。

    然后顶点着色器可以将该值作为uint 类型传递给片段着色器(但只能使用flat 插值限定符)。当然,三角形的每个片段都会得到相同的值。

    【讨论】:

    • 这很难过。他们是否正在考虑改变这一点?
    • 为什么这么难过? GPU 针对浮点计算进行了大量优化。他们用缓慢地做许多不同的事情来完成一个任务但速度很快,所以你在内存大小上的损失通常比计算速度所弥补的要多。 (即使在 CPU 上,您的寄存器和缓存也针对整个字(32 位或 64 位)进行了优化。
    • 我冒昧地猜测,即使在着色器中字节(8 位)将作为无符号整数(32 位)接收,事实上您将数据作为字节发送无论如何都是一个很好的收获,因为它节省了发送额外的 3 个字节。当您有数百个实例化转换时,这可以加起来。至少这是我所期望的情况。不确定如果使用共享 CPU/GPU 内存是否有任何好处。
    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 2014-12-06
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多