【发布时间】:2014-03-24 12:53:26
【问题描述】:
我有一个片段着色器的想法,它会检查当前片段是否在多边形内。该多边形的顶点值应该通过浮点数组传输到该着色器。问题是统一的浮点数组被丢弃(位置 = -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' 只是我的测试场景中使用的一个临时值,因为我知道我使用的多边形的大小。
【问题讨论】:
-
“不直接使用”是什么意思?是否使用过?你能发布一些着色器的代码吗?
-
到目前为止你尝试过什么?对于这种效果,您可以使用模板缓冲区。
-
我正在对这些多边形进行三角剖分,但这不符合我的需要。
-
不要描述代码,贴出来。如果着色器使用的是统一数组,则无法对其进行优化。所以你肯定在那里做错了什么。如果您显示代码,我们或许能够告诉您是什么。