【问题标题】:Transpose a mat4 in OpenGL ES 2.0 GLSL在 OpenGL ES 2.0 GLSL 中转置 mat4
【发布时间】:2013-08-03 16:01:28
【问题描述】:

我想在我的 OpenGL ES 2.0 顶点着色器中转置一个矩阵,但显然我的 iPad 3 不支持 GLSL #version 120,这是内置函数 transpose(mat4) 所需要的。

我知道有一些解决方法可以解决这个问题,例如在将矩阵传递到图形芯片之前在 CPU 上转置矩阵,但如果我可以在那里转置它,它会使我的着色器更简单。

那么,在 iOS 6 设备的着色器中是否有 transpose mat4 选项?

另一件事:问题

What version of GLSL is used in the iPhone(s)?

说 OpenGL ES 2.0 使用 GLSL 1.20。那么为什么#version 120 不能在 iPad 3 上运行呢?

【问题讨论】:

  • 你试过没有#version和转置吗?我很确定它适用于标准 ES 2.0 参考卡。
  • "说 OpenGL ES 2.0 使用 GLSL 1.20" 不,它没有。它说它“基于”1.20,而不是它使用 1.20。
  • @JustinMeiners 是的,我试过了,没用。没有#version 120transpose 是未定义的。
  • @NicolBolas 你是对的。你知道哪些 iOS 设备支持哪些 GLSL 版本吗?

标签: ios ipad opengl-es opengl-es-2.0 glsl


【解决方案1】:

您是否尝试过自己转置它?是性能问题吗?如果没有,我会尝试它,因为这是优化器应该处理的事情,并且需要两分钟。比如:

highp mat4 transpose(in highp mat4 inMatrix) {
    highp vec4 i0 = inMatrix[0];
    highp vec4 i1 = inMatrix[1];
    highp vec4 i2 = inMatrix[2];
    highp vec4 i3 = inMatrix[3];

    highp mat4 outMatrix = mat4(
                 vec4(i0.x, i1.x, i2.x, i3.x),
                 vec4(i0.y, i1.y, i2.y, i3.y),
                 vec4(i0.z, i1.z, i2.z, i3.z),
                 vec4(i0.w, i1.w, i2.w, i3.w)
                 );

    return outMatrix;
}

【讨论】:

  • 如果没有内置选项就这样做。
  • 代码明显有问题。 i3.y, i3.y 应该是 i2.y, i3.y。 z 和 w 也是如此。
【解决方案2】:

正如What version of GLSL is used in the iPhone(s)? 的正确回答所说,iOS 支持 OpenGL ES 2.0 及其配套的着色语言:ESSL 1.0。 ESSL 1.0 基于但不等同于 GLSL 1.20。

ESSL 1.0 中没有内置转置功能,因此您需要自己实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多