【问题标题】:Passing 2D array into GLES opengl shader将二维数组传递给 GLES opengl 着色器
【发布时间】:2015-10-16 20:58:11
【问题描述】:

我有一个 2D 浮点数组(在这种情况下,它表示具有 R G B 值的 256 色调色板)

static float[][] glColorPaletteArray = new float[256][3];

我填充了数组,现在想将它传递给 GLES。如何在android中传递二维数组?我试试

GLES20.glUniform3fv(paletteLoc,256,glColorPaletteArray,0);

但它抱怨期待一维数组(发现 float[][] 期待 float[])。

着色器期待 vec3 统一,即

uniform vec3 palette[256];

所以我需要保留 2D 数组,以便 RGB 分量是单独的浮点数。

将 2D 数组正确传递给 GLES 着色器的秘诀是什么,这样我就可以通过使用来访问着色器中的 RGB 值

int red = palette[100].r;

【问题讨论】:

    标签: android arrays opengl-es


    【解决方案1】:

    简短的回答是:您不能将二维数组传递给着色器。

    为了将二维数组传递给 OpenGL,必须将数组展平。这相对容易,例如,可以按如下方式完成:

    static float[][] glColorPaletteArray = new float[256][3];
    static float[] openglArray = new float[256*3];
    
    for (int i = 0; i < 256; i++)
        for (int j = 0; j < 3; j++)
            openglArray[i * 3 + j] = glColorPalletArray[i][j];
    

    但我建议,如果可能的话,您首先在 1D 中定义数组。

    【讨论】:

    • 好的,但是一旦转换为 1D,着色器(期望 vec3 条目)是否知道如何提取 256 种颜色中每种颜色的 RGB 分量?
    • 会的。总是 3 个连续的浮点数将用作一个 vec3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2014-11-09
    • 2011-03-14
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多