在OpenGL中如何将原语渲染为线框?


当前回答

在现代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等)中改变多边形模式,你可能会得到一些粗略的结果,因为你的顶点数据是三角形的,你是输出线。为了获得最好的效果,可以考虑使用几何着色器或为线框创建新数据。

你可以这样使用供过于求的库:

对于球面: glutWireSphere(半径20 20); 圆柱体: GLUquadric *quadratic = gluNewQuadric(); GLU_LINE gluQuadricDrawStyle(二次); gluCylinder(二次,1,1,1,12日1); 对于立方体: glutWireCube (1.5);

在现代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); 阅读更多关于几何着色器

使用这个函数:

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参考页。

glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

要打开电源,

glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

回归正常。

注意,如果启用了纹理映射和照明,它们仍然会应用到线框线上,这看起来可能很奇怪。