【问题标题】:GLSL endianness macroGLSL 字节顺序宏
【发布时间】:2021-07-11 11:26:09
【问题描述】:

有没有办法在 GLSL 中检查目标机器的字节顺序?例如在 OpenCL 中我可以使用

#ifdef __ENDIAN_LITTLE__
uint x = v << 1;
#else
uint x = v >> 1;
#endif

【问题讨论】:

  • 您可以在 CPU 端检查并将其作为制服传递。在渲染循环开始之前,您不需要传递每一帧,一次就足够了。
  • 目标机器是指GPU吗?是否存在影响任何结果的情况?如果您提供 v 作为统一或顶点属性,大概只有 CPU 的字节序起作用,即使在那里,如果它是像 GLuint 这样的 GL... 类型,它应该按预期传递值.
  • 是的,我指的是 GPU。是的,它可以有所作为。例如,我试图将字节缓冲区传递给 GLSL,但当然没有字节数据类型,并且根据字节序,我的 char * cpu_data 将以不同的方式映射到 uint * glsl_data。我需要知道该 uint 的形式是 0xZ000 还是 0x000Z(其中 Z 是 char 的原始值)。
  • @AndreiDespinoiu 我也想过,但是我找不到任何可以让我查询 GPU 字节序的函数。
  • @alagris 你真的可以吗?几乎每个消费级 GPU 要么通过 PCIe 连接到 x86 处理器(都使用小端序),要么集成到 CPU(嵌入式图形),要么是 PCB 硬件的一部分(嵌入式)。

标签: opengl glsl endianness


【解决方案1】:

在 GLSL 4.60 规范中搜索“endian”不会产生任何匹配。搜索“订单”只会显示不相关的结果。所以我想在 GLSL 中没有特殊的方法可以查询 GPU 的字节顺序。

最好的办法是在开始时使用特制的着色器检测一次(例如,将提供的字节缓冲区作为 uint 读取,并将与字节顺序相关的结果放入输出片段,然后 glReadPixels),并且然后,根据结果,将适当的#defines 插入到依赖于此的着色器中。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多