你如何在OpenGL中将图元渲染为线框?

你如何在OpenGL中将图元渲染为线框?


glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

打开,

glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

恢复正常。

请注意,纹理映射和照明等功能仍将应用于线框线条,如果它们已启用,这看起来很奇怪。


从http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/ogladv/tut5

// Turn on wireframe mode
glPolygonMode(GL_FRONT, GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);

// Draw the box
DrawBox();

// Turn off wireframe mode
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);

假设在OpenGL 3及更高版本中使用向前兼容的上下文,您可以像前面提到的那样使用glPolygonMode ,但请注意厚度大于1px的行现在已被弃用。 因此,虽然可以将三角形绘制为线框,但它们需要非常薄。 在OpenGL ES中,您可以使用具有相同限制的GL_LINES

在OpenGL中,可以使用几何着色器来获取传入的三角形,对其进行反汇编,并将它们作为四边形(实际上是三角形对)仿照粗线发送光栅化。 真的很简单,除了几何着色器因恶劣的性能缩放而臭名昭着。

你可以做什么,而在OpenGL ES中也可以使用片段着色器。 考虑在三角形上应用线框三角形的纹理。 除了不需要纹理外,它可以通过程序生成。 但足够的话,让我们编码。 片段着色器:

in vec3 v_barycentric; // barycentric coordinate inside the triangle
uniform float f_thickness; // thickness of the rendered lines

void main()
{
    float f_closest_edge = min(v_barycentric.x,
        min(v_barycentric.y, v_barycentric.z)); // see to which edge this pixel is the closest
    float f_width = fwidth(f_closest_edge); // calculate derivative (divide f_thickness by this to have the line width constant in screen-space)
    float f_alpha = smoothstep(f_thickness, f_thickness + f_width, f_closest_edge); // calculate alpha
    gl_FragColor = vec4(vec3(.0), f_alpha);
}

顶点着色器:

in vec4 v_pos; // position of the vertices
in vec3 v_bc; // barycentric coordinate inside the triangle

out vec3 v_barycentric; // barycentric coordinate inside the triangle

uniform mat4 t_mvp; // modeview-projection matrix

void main()
{
    gl_Position = t_mvp * v_pos;
    v_barycentric = v_bc; // just pass it on
}

这里,三个三角形顶点的重心坐标简单地为(1, 0, 0) 1,0,0 (1, 0, 0)(0, 1, 0)(0, 0, 1) 0,0,1)(顺序并不重要,这使得潜在地包装成三角形条带更轻松)。

这种方法的明显缺点是它会吃掉一些纹理坐标,并且你需要修改你的顶点数组。 可以用一个非常简单的几何着色器来解决,但我仍然怀疑它会比给GPU提供更多数据更慢。

链接地址: http://www.djcxy.com/p/34045.html

上一篇: How do you render primitives as wireframes in OpenGL?

下一篇: OpenGL (LWJGL): Render to Texture not working