在OpenGL中如何将原语渲染为线框?
当前回答
最简单的方法是将原语绘制为GL_LINE_STRIP。
glBegin(GL_LINE_STRIP);
/* Draw vertices here */
glEnd();
其他回答
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
要打开电源,
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
回归正常。
注意,如果启用了纹理映射和照明,它们仍然会应用到线框线上,这看起来可能很奇怪。
最简单的方法是将原语绘制为GL_LINE_STRIP。
glBegin(GL_LINE_STRIP);
/* Draw vertices here */
glEnd();
在现代OpenGL(OpenGL 3.2及更高版本)中,你可以使用几何着色器:
#version 330
layout (triangles) in;
layout (line_strip /*for lines, use "points" for points*/, max_vertices=3) out;
in vec2 texcoords_pass[]; //Texcoords from Vertex Shader
in vec3 normals_pass[]; //Normals from Vertex Shader
out vec3 normals; //Normals for Fragment Shader
out vec2 texcoords; //Texcoords for Fragment Shader
void main(void)
{
int i;
for (i = 0; i < gl_in.length(); i++)
{
texcoords=texcoords_pass[i]; //Pass through
normals=normals_pass[i]; //Pass through
gl_Position = gl_in[i].gl_Position; //Pass through
EmitVertex();
}
EndPrimitive();
}
通知:
对于点,改变布局(line_strip, max_vertices=3);到布局(points, max_vertices=3); 阅读更多关于几何着色器
如果您正在使用固定的管道(OpenGL < 3.3)或兼容性配置文件,您可以使用
//Turn on wireframe mode
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//Draw the scene with polygons as lines (wireframe)
renderScene();
//Turn off wireframe mode
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
在这种情况下,你可以通过调用glLineWidth来改变行宽
否则,你需要在你的绘制方法(glDrawElements, glDrawArrays等)中改变多边形模式,你可能会得到一些粗略的结果,因为你的顶点数据是三角形的,你是输出线。为了获得最好的效果,可以考虑使用几何着色器或为线框创建新数据。
使用这个函数:
void glPolygonMode(GLenum face, GLenum mode);
face:指定模式适用的多边形面。多边形的正面可以是GL_FRONT,背面可以是GL_BACK,两者都可以是GL_FRONT_AND_BACK。
mode:定义了三种模式。
GL_POINT:标记为边界边起点的多边形顶点被绘制为点。 GL_LINE:多边形的边界边被绘制为线段。(你的目标) GL_FILL:填充多边形内部。
glPolygonMode控制图形管道中栅格化多边形的解释。
要了解更多信息,请参阅khronos组中的OpenGL参考页。