我有一个结构
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]);
}
}
答案 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使用相同的统一名称)。