2014-03-25 71 views
1

考慮跟隨片段着色器:統一優化( - 1個值)

uniform PolygonData 
{ 
    int count; 
    float points[1024]; 
} polygon; 

out vec4 outColor; 

void main() 
{ 
    float j; 
    for (int i = 0; i < polygon.count; ++i) 
    { 
      j = polygon.points[i++]; 
      j = polygon.points[i++]; 
      j = polygon.points[i++]; 
    } 

    outColor = vec4(1, 1, j, 1); 
} 

爲什麼polygon.countpolygon.points優化了呢?

+0

也許是因爲你不使用它的任何東西?你永遠不會在'polygon'中初始化'points'。您的整個for循環只會將'j'設置爲與最後一個'polygon.point [2]'相同的設置,該設置永遠不會設置。所以不妨刪除for循環,結果應該是一樣的:) – rozina

+0

@rozina你怎麼知道他們從來沒有設置它? – Ben

+0

@Ben該代碼不包含任何初始化。 Ofcouse我可能是錯的,因爲這可能是一些OpenGL細節。不過我希望從代碼中可以看到多邊形的初始化。 – rozina

回答

0

@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); 
    } 
} 

result

感謝您的幫助。