如果当前片段在多边形内部,我知道片段着色器会出现问题。该多边形的顶点值应该由浮点数组转移到该着色器。问题是浮点数的均匀数组会被丢弃(位置= -1),因为它不会被着色器直接使用。
我不知道如何通过统一值的其他方法将数组传递给着色器。有人可以指导我找到更好的解决方案吗?
TIA。
编辑:(更好的解释)
我有一个float值数组,表示某个多边形的顶点。我从该数组计算最小最大值并将这两个(最小/最大)向量传递给几何着色器,该几何着色器在该多边形下产生四边形。现在,我的片段着色器应该采用该多边形顶点数组,并分析每个片段是否在该多边形内部。如果在里面,画一些颜色,如果外面画一些其他颜色。
顶点:
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));
}
&#39; 570&#39;只是我的测试场景中使用的临时值,因为我知道我使用的多边形的大小。
答案 0 :(得分:0)
您可以将多边形顶点作为不同的几何着色器
传递