如何将结构数组传递给着色器

时间:2014-12-18 08:48:15

标签: opengl glsl

我有一个结构

struct distance
{
    int dist[5];
};

并将其用作数组

distance dist[100];

如何将此传递给我的曲面细分控件着色器?

着色器:

 #version 410 core

struct distance
{
    int dist[5];
};

uniform distance myDistances[100];

layout (vertices = 16) out;

void main(void)
{
    uint id = gl_InvocationID;

    if (id == 0)
    {
        gl_TessLevelInner[0] = myDistances[gl_PrimitiveID].dist[4];
        gl_TessLevelInner[1] = myDistances[gl_PrimitiveID].dist[4];
        gl_TessLevelOuter[0] = myDistances[gl_PrimitiveID].dist[0];
        gl_TessLevelOuter[1] = myDistances[gl_PrimitiveID].dist[1];
        gl_TessLevelOuter[2] = myDistances[gl_PrimitiveID].dist[2];
        gl_TessLevelOuter[3] = myDistances[gl_PrimitiveID].dist[3];
    }

    gl_out[gl_InvocationID].gl_Position = gl_in[id].gl_Position;
}

申请统一定义:

struct
    {
        struct
        {
            int     mv_matrix;
            int     proj_matrix;
            int     mvp;
            int     dist;
        } patch;
        struct
        {
            int     draw_color;
            int     mvp;
        } control_point;
    } uniforms;

在我的主要

glUniformMatrix4fv(uniforms.patch.mv_matrix, 1, GL_FALSE, mv_matrix);
    glUniformMatrix4fv(uniforms.patch.proj_matrix, 1, GL_FALSE, proj_matrix);
    glUniformMatrix4fv(uniforms.patch.mvp, 1, GL_FALSE, proj_matrix * mv_matrix);
    for(int i=0; i<100; i++)
    {
        for(int j=0; j<5; j++)
        {
            glGetUniformLocation(program, "myDistances[i].dist[j]");
            glUniform1i(uniforms.patch.dist, ocean.detail[i].dist[j]);
        }
    }

1 个答案:

答案 0 :(得分:0)

假设您希望将数据作为制服传递:您可以使用与C ++相似的结构。以下代码可能是您的着色器:

struct distance
{
    int dist[5];
};

uniform distance myDistances[100];

void main()
{
     ....
}

在您的应用程序中,您可以通过

访问结构
glUniform1i(..., "myDistances[i].dist[j]")

其中i = [0-99]且j = [1-5](或通过glUniform1iv使用相同的统一名称)。