如何用不同于边界的颜色填充多边形?

时间:2011-02-28 18:49:38

标签: c opengl

我需要绘制一个边界线为一种颜色的多边形,并用另一种颜色填充内部。是否有捷径可寻 ?我目前绘制两个多边形,一个用于内部颜色,一个用于边界。我认为必须做得更好。谢谢你的帮助。

       glColor3d (1, 1., .7);
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        glBegin(GL_TRIANGLES);
                glVertex3f(-0.8f, 0.0f, 0.0f);
                glVertex3f(-0.6f, 0.0f, 0.0f);
                glVertex3f(-0.7f, 0.2f, 0.0f);
        glEnd();

        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glColor3d (.5, .5, .7);
        glBegin(GL_TRIANGLES);
                glVertex3f(-0.8f, 0.0f, 0.0f);
                glVertex3f(-0.6f, 0.0f, 0.0f);
                glVertex3f(-0.7f, 0.2f, 0.0f);
        glEnd();

谢谢大家回答我的问题。我对openGL很新,并且正在寻找一个简单问题的简单答案。答案似乎并不那么简单,可能需要一个学期的学习。

4 个答案:

答案 0 :(得分:3)

更现代的方法是通过几何着色器实现这一点。这适用于OpenGL 3.2及更高版本作为核心功能的一部分,或适用于扩展名为GL_EXT_geometry_shader4的OpenGL 2.1。

本文包含所有相关理论:Shader-Based wireframe drawing。它还提供了GLSL中最简单技术的示例实现。

这是我自己的抨击,基本上是OpenGL 3.3的实现端口,仅限于三角形基元:

顶点着色器:(将输入替换为用于传递顶点数据m,v和p矩阵的任何内容)

#version 330

layout(location = 0) in vec4 position;
layout(location = 1) in mat4 mv;

out Data
{
    vec4 position;
} vdata;

uniform mat4 projection;

void main()
{
    vdata.position = projection * mv * position;
}

几何着色器:

#version 330
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;

in Data
{
    vec4 position;
} vdata[3];

out Data
{
    noperspective out vec3 dist;
} gdata;

void main()
{
    vec2 scale = vec2(500.0f, 500.0f); // scaling factor to make 'd' in frag shader big enough to show something
    vec2 p0 = scale * vdata[0].position.xy/vdata[0].position.w;
    vec2 p1 = scale * vdata[1].position.xy/vdata[1].position.w;
    vec2 p2 = scale * vdata[2].position.xy/vdata[2].position.w;

    vec2 v0 = p2-p1;
    vec2 v1 = p2-p0;
    vec2 v2 = p1-p0;
    float area = abs(v1.x*v2.y - v1.y*v2.x);

    gdata.dist = vec3(area/length(v0),0,0);
    gl_Position = vdata[0].position;
    EmitVertex();

    gdata.dist = vec3(0,area/length(v1),0);
    gl_Position = vdata[1].position;
    EmitVertex();

    gdata.dist = vec3(0,0,area/length(v2));
    gl_Position = vdata[2].position;
    EmitVertex();

    EndPrimitive();
}

顶点着色器:(用你需要的颜色替换颜色!)

#version 330

in Data
{
    noperspective in vec3 dist;
} gdata;

out vec4 outputColor;

uniform sampler2D tex;

const vec4 wireframeColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
const vec4 fillColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);

void main()
{
    float d = min(gdata.dist.x, min(gdata.dist.y, gdata.dist.z));
    float I = exp2(-2*d*d);
    outputColor = mix(fillColor, wireframeColor, I);
}

答案 1 :(得分:1)

您可以使用glPolygonMode

在多边形,线条和点之间切换填充模式

为了绘制不同颜色的多边形线,您可以执行以下操作:

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
draw_mesh( fill_color );
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glEnable(GL_POLYGON_OFFSET_LINE);
glPolygonOffset(-1.f,-1.f);
draw_mesh( line_color );

可能需要线偏移,因为OpenGL不保证多边形的边缘将以与线完全相同的像素进行光栅化。因此,如果没有明确的偏移,由于深度测试失败,您可能会因多边形而隐藏线条。

答案 2 :(得分:0)

有两种方法可以做到这一点:

  • 你现在所做的那个(2个多边形,一个稍大于另一个或后面绘制)

  • 质地

据我所知,没有其他可能性,从性能的角度来看,这两种可能性,特别是第一种,只要你只进行颜色填充,就非常快。

答案 3 :(得分:0)

我认为你应该看到这个答案: fill and outline

  

首先使用绘制三角形   glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)并使用您想要的颜色。   然后再使用绘制三角形   使用轮廓颜色的glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)。