@GuyRT
是的。就是這樣。從那裏我得到了超過最大統一陣列大小的信息。
這是我在做什麼:
頂點:
in vec3 inPosition;
void main(void)
{
gl_Position = vec4(inPosition, 1.0);
}
幾何:
layout(lines) in;
layout(triangle_strip) out;
layout(max_vertices = 4) out;
out vec3 worldPos;
uniform mat4 u_proj;
void main()
{
vec4 pos0 = u_proj * gl_in[0].gl_Position;
vec4 pos1 = u_proj * gl_in[1].gl_Position;
//left up
gl_Position.x = pos0.x;
gl_Position.y = pos1.y;
gl_Position.w = pos0.w;
worldPos = gl_Position.xyz;
EmitVertex();
//left down
gl_Position = pos0;
worldPos = gl_Position.xyz;
EmitVertex();
//right up
gl_Position = pos1;
worldPos = gl_Position.xyz;
EmitVertex();
//right down
gl_Position.x = pos1.x;
gl_Position.y = pos0.y;
gl_Position.w = pos1.w;
worldPos = gl_Position.xyz;
EmitVertex();
EndPrimitive();
}
片段:
struct PolyData
{
int count;
float points[256];
};
uniform PolyData p;
uniform mat4 u_proj;
in vec3 worldPos;
out vec4 outColor;
void main()
{
float testx = worldPos.x;
float testy = worldPos.y;
bool c = false;
int i;
int j;
for (i = 0, j = p.count - 4; i < p.count; j = i, i = i + 3)
{
vec4 i_vec = u_proj * vec4(p.points[i], p.points[i + 1], 0, 1.0);
vec4 j_vec = u_proj * vec4(p.points[j], p.points[j + 1], 0, 1.0);
if ( (i_vec.y >= testy) != (j_vec.y >= testy) && (testx <= (j_vec.x - i_vec.x) * (testy - i_vec.y)/(j_vec.y - i_vec.y) + i_vec.x))
c = !c;
}
if (c == true)
{
outColor = vec4(1, 1, 0, 1);
}
else
{
outColor = vec4(0, 0, 0, 0);
}
}

感謝您的幫助。
也許是因爲你不使用它的任何東西?你永遠不會在'polygon'中初始化'points'。您的整個for循環只會將'j'設置爲與最後一個'polygon.point [2]'相同的設置,該設置永遠不會設置。所以不妨刪除for循環,結果應該是一樣的:) – rozina
@rozina你怎麼知道他們從來沒有設置它? – Ben
@Ben該代碼不包含任何初始化。 Ofcouse我可能是錯的,因爲這可能是一些OpenGL細節。不過我希望從代碼中可以看到多邊形的初始化。 – rozina