2014-03-24 33 views
1

我有一个片段着色器的想法,如果当前片段位于多边形内部,就会使用Ckecked。该多边形的顶点值应该由浮点数组转移到该着色器。问题在于浮点数的统一数组被丢弃(位置= -1),因为它没有被着色器直接使用。将非均匀阵列传递给着色器

我不知道如何通过统一值通过其他方法将数组传递给着色器。有人可以指导我更好的解决方案吗?

TIA。

编辑:(更好的解释)

我有代表一些多边形顶点的浮点值的阵列。我计算该阵列的最小最大值,并将这两个(最小/最大)向量传递给几何着色器,该着色器在该多边形下产生一个四元组。现在,我的片段着色器应该采用该多边形顶点数组,并分析每个片段是否位于该多边形内。如果里面画一些颜色,如果外面画一些其他颜色。

顶点:

in vec3 inPosition; 

void main(void) 
{ 
    gl_Position = vec4(inPosition, 1.0); 
} 

几何:

layout(lines) in; 
layout(triangle_strip) out; 
layout(max_vertices = 4) out; 

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; 
    EmitVertex(); 
    //left down 
    gl_Position = pos0; 
    EmitVertex(); 
    //right up 
    gl_Position = pos1; 
    EmitVertex(); 
    //right down 
    gl_Position.x = pos1.x; 
    gl_Position.y = pos0.y; 
    gl_Position.w = pos1.w; 
    EmitVertex(); 
    EndPrimitive(); 
} 

片段:

uniform float points[570]; 

out vec4 outColor; 

void main() 
{ 
    int nvert = 570; 

    float testx = gl_FragCoord.x; 
    float testy = gl_FragCoord.y; 

    int i; 
    int j; 
    bool c = false; 
    for (i = 0, j = nvert - 3; i < nvert; i = i + 3, j = i) 
    { 
      if (((points[i + 1]>testy) != (points[j + 1] > testy)) && (testx < (points[j] - points[i]) * (testy - points[i + 1])/(points[j + 1] - points[i + 1]) + points[i])) 
      { 
        c = !c; 
      } 
    } 

    if (c == true) 
    { 
      outColor = vec4(1.0, 1.0, 1.0, 1.0); 
    } 
    else 
    { 
      outColor = vec4(0.0, 0.0, 0.0, 1.0); 
    } 
} 

这些:

m_FILL_uniProjId = glGetUniformLocation(m_FillProgram, "u_proj"); 
m_FILL_uniCount = glGetUniformLocation(m_FillProgram, "count"); 
m_FILL_uniPoints = glGetUniformLocation(m_FillProgram, "points"); 

每个返回-1。

这是我如何填写我的均匀阵列:​​

for (int i = 0; i < 570; ++i) 
{ 
    glUniform1fv(m_FILL_uniPoints + i, 1, &m_Points->at(i)); 
} 

“570”只是在我的测试场景中使用,因为我知道多边形的大小,我使用的是临时值。

+2

你是什么意思的“不直接使用”?它是否被使用?你能发表一些着色器的代码吗? – Raxvan

+0

你到目前为止尝试过什么?为此,您可以使用模板缓冲区。 – Raxvan

+0

我正在对这些多边形进行三角剖分,但这不符合我的需求。 – kpeek

回答

0

您可以通过多边形顶点作为不同的几何着色器