为三角形和四边形添加边框(OpenGL GLFW)

时间:2015-04-12 01:28:25

标签: c++ opengl visual-studio-2013 geometry glfw

我有一些isosphere的代码,我在我的代码的主while循环中调用的函数中有。一切都很好,除了我希望能够在球体上的所有单个形状周围应用边框。我将最终简化此代码,但这只是一个测试文件。在while循环之前我需要添加什么来启用边框或类似的东西吗?

#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>

#define PI 3.14159265358979323846
float res = 15, rad = .5;

void display(){

//Create top and bottom cap of isosphere
glBegin(GL_TRIANGLES);

glColor3f(1.f, 0.f, 0.f);

for (float a = 0; a <= 360; a += res){
    glVertex3f(0, 0, rad);
    glVertex3f(
        rad * (sin((res)* (PI / 180))) * (cos((a)* (PI / 180))),
        rad * (sin((res)* (PI / 180))) * (sin((a)* (PI / 180))),
        rad * (cos((res)* (PI / 180)))
        );
    glVertex3f(
        rad * (sin((res)* (PI / 180))) * (cos((a + res)* (PI / 180))),
        rad * (sin((res)* (PI / 180))) * (sin((a + res)* (PI / 180))),
        rad * (cos((res)* (PI / 180)))
        );

    glVertex3f(0, 0, -rad);
    glVertex3f(
        -rad * (sin((res)* (PI / 180))) * (cos((a)* (PI / 180))),
        -rad * (sin((res)* (PI / 180))) * (sin((a)* (PI / 180))),
        -rad * (cos((res)* (PI / 180)))
        );
    glVertex3f(
        -rad * (sin((res)* (PI / 180))) * (cos((a + res)* (PI / 180))),
        -rad * (sin((res)* (PI / 180))) * (sin((a + res)* (PI / 180))),
        -rad * (cos((res)* (PI / 180)))
        );
}

glEnd();

//Create next part of isosphere
glBegin(GL_QUADS);

glColor3f(1.f, 0.f, 0.f);

for (int a = res; a <= 360; a += res){
    for (int t = 0; t <= 360; t += res){
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(
            rad * (sin((a)* (PI / 180))) * (cos((t)* (PI / 180))),
            rad * (sin((a)* (PI / 180))) * (sin((t)* (PI / 180))),
            rad * (cos((a)* (PI / 180)))
        );
        glVertex3f(
            rad * (sin((a + res)* (PI / 180))) * (cos((t)* (PI / 180))),
            rad * (sin((a + res)* (PI / 180))) * (sin((t)* (PI / 180))),
            rad * (cos((a + res)* (PI / 180)))
        );
        glVertex3f(
            rad * (sin((a + res)* (PI / 180))) * (cos((t + res)* (PI / 180))),
            rad * (sin((a + res)* (PI / 180))) * (sin((t + res)* (PI / 180))),
            rad * (cos((a + res)* (PI / 180)))
        );
        glVertex3f(
            rad * (sin((a)* (PI / 180))) * (cos((t + res)* (PI / 180))),
            rad * (sin((a)* (PI / 180))) * (sin((t + res)* (PI / 180))),
            rad * (cos((a)* (PI / 180)))
        );
    }
}

glEnd();

}

1 个答案:

答案 0 :(得分:0)

渲染球体两次。就像你刚刚做的那样,第二次将多边形模式设置为GL_LINE:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

如果你使用带有着色器的现代OpenGL,你可以在一次绘制中完成它,如果你想尝试留下评论。

编辑:因为你要求使用现代OpenGL:

你正在使用过时的立即模式(glBegin / glEnd)。您应该阅读缓冲区对象和着色器。幸运的是,有很多教程解释了这些是如何工作的。

此处显示了渲染包含其线框的模型的工作示例:http://prideout.net/blog/?p=48
虽然主要是关于细分,但您可以查看代码以了解渲染是如何完成的。