我有一个在openGL ES 2.0中创建的四面体对象。我想要实现的是显示多边形在其基色上的实际线框。有没有办法实现这种效果?
另外,我的四面体是粉红色的。我怎样才能改变它的颜色?
答案 0 :(得分:4)
1:首先像往常一样绘制对象,然后再次绘制(使用不同的着色器,或者它将与对象颜色相同,因此不可见),使用GLES20.GL_LINES,GL_LINE_LOOP或GL_LINE_STRIP。
您可能希望在绘制线条时略微缩放对象,以便深度测试不会确定线条在对象后面并忽略它们。
2:这在你的着色器中完成,将gl_FragColor设置为包含你想要的纯色rgba值的vec4。
答案 1 :(得分:3)
除了Jave所说的。您可以使用多边形偏移(使用glPolygonOffset
),而不是放大整个对象(其最佳数量始终取决于对象和当前视图),其主要应用实际上是线框叠加
它基本上可以通过稍微调整结果片段的深度值来实现,这在ES中无法实现,因为你无法写入深度缓冲区(我猜他们之所以没有从ES中删除它,就像他们在桌面GL 3+中做了。因此,您基本上使用相同的顶点渲染实体对象和对象的线版本,但使用实体对象的多边形偏移配置,稍微增加结果片段的深度值(将它们推离观察者),从而放置三角形总是在视图空间(或实际上是窗口空间)的行后面。有关详细信息,请参阅here。
虽然四面体的情况可能会因为边缘非常锋利而出现问题。
答案 2 :(得分:1)
虽然这已经存在了一段时间(现在已经过去一年),但这也可能有所帮助:请注意,您可能不需要使用其他着色器来获得所需的结果。您可以禁用顶点属性数组,然后指定并加载常量顶点属性数据(线框线颜色)以绘制线框。例如:
float coloredcube[] = { 2, 2, 2, 1, 0, 0, -2, 2, 2, 0, 1, 0, -2, -2, 2, 0,
0, 1, 2, -2, 2, 1, 1, 0, 2, 2, -2, 1, 0, 1, -2, 2, -2, 0, 1, 1, -2,
-2, -2, 1, 1, 1, 2, -2, -2, 0, 0, 0
};
short indices[] = { 0, 1, 2, 0, 2, 3, //back
0, 4, 7, //right
0, 7, 3,
7, 6, 2, //bottom
7, 2, 3,
4, 5, 6, //front
4, 6, 7,
5, 1, 2, //left
5, 2, 6,
0, 1, 5, 0, 5, 4 //top
};
short lineindices[] = { 0, 1, 1, 2, 0, 2, 2, 3,
0, 4, 4, 7, 0, 7, 7, 3,
7, 6, 6, 2, 7, 2, 4, 5,
5, 6, 4, 6, 5, 2, 1, 5, 0, 5, 0, 3 };
glVertexAttribPointer(iPosition, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),coloredcube);
glEnableVertexAttribArray(iPosition);
glVertexAttribPointer(iColor, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),coloredcube + 3);
glEnableVertexAttribArray(iColor);
// offset the filled object to avoid the stitching that can arise when the wireframe lines are drawn
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(2.0f, 2.0f);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, indices);
glDisable(GL_POLYGON_OFFSET_FILL);
//Then disable the vertex colors and draw the wire frame with one constant color
glDisableVertexAttribArray(iColor);
glLineWidth(1.0f);
GLfloat color[4] = { 1.0f, 0.0f, 0.0f, 0.5f };
glVertexAttrib4fv(iColor, color);
glDrawElements(GL_LINES, 36, GL_UNSIGNED_SHORT, lineindices);
类似的例子可以在“The OpenGL ES 2.0编程指南”第109,110页中找到。