【问题标题】:How to pass int array into Android OpenGl fragment shader如何将 int 数组传递给 Android OpenGL 片段着色器
【发布时间】:2013-01-07 15:52:15
【问题描述】:

总的来说,我对 OpenGL 和着色器非常陌生。我想在片段着色器中使用我的 java 代码中的静态 int 数组来操纵相机的颜色。有没有办法将我的 int 数组传递给着色器,或者只是让着色器能够以某种方式访问​​我的数组?

谢谢, 迈克

【问题讨论】:

    标签: android opengl-es shader


    【解决方案1】:

    在着色器代码中使用所谓的静态数组的正确方法是将其作为 Uniform 传递:

    http://www.opengl.org/wiki/GLAPI/glUniform

    在您的着色器代码中,您指定需要一个外部数组:

    uniform int colors[3]; // Specify an array of 3 integers
    

    在你的 java 代码中使用这个:

    int array[3] = {0, 1, 2};
    int location = GLES20.glGetUniformLocation(program_id, "colors");
    GLES20.glUniform1iv(location,
                  3,
                  array,
                  0);
    

    【讨论】:

    • 如何找出可以用于数组的最大大小是多少?谢谢
    【解决方案2】:

    由于您正在尝试操纵相机的颜色,我假设您正在尝试将一个小数组传递给片段着色器(可能是 3 或 4 个整数)。

    因为所有片段可能只有一个颜色相同的相机,所以传递数据的最简单方法是使用 uniform。在你的片段中声明一个制服:

    uniform vec4 cameraColor;
    

    然后在您的 Java 代码中,获取制服的位置并将数据传递给它(这是 C++ 代码,Java 代码可能有点不同):

    GLint uniColorLocation = glGetUniformLocation( shaderProgram, "cameraColor" );
    glUniform4i( uniColorLocation, array[0], array[1], array[2], array[3] );
    

    如果您想将多种颜色传递给片段着色器,您可以使用片段属性 (ins) 来传递数据。在 Java 代码中,您将使用诸如 glVertexAttribPointerglBufferData 之类的调用来实现此目的。另一种选择是使用 纹理数据 将信息传递给着色器。在这里,单个纹素可以对应一个对象的相机颜色。

    【讨论】:

    • 感谢您的示例。它实际上是一个非常大的数组(大约 516*516),但这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多