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”只是在我的测试场景中使用,因为我知道多边形的大小,我使用的是临时值。
你是什么意思的“不直接使用”?它是否被使用?你能发表一些着色器的代码吗? – Raxvan
你到目前为止尝试过什么?为此,您可以使用模板缓冲区。 – Raxvan
我正在对这些多边形进行三角剖分,但这不符合我的需求。 – kpeek