我有一些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();
}
答案 0 :(得分:0)
渲染球体两次。就像你刚刚做的那样,第二次将多边形模式设置为GL_LINE:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
如果你使用带有着色器的现代OpenGL,你可以在一次绘制中完成它,如果你想尝试留下评论。
编辑:因为你要求使用现代OpenGL:你正在使用过时的立即模式(glBegin / glEnd)。您应该阅读缓冲区对象和着色器。幸运的是,有很多教程解释了这些是如何工作的。
此处显示了渲染包含其线框的模型的工作示例:http://prideout.net/blog/?p=48
虽然主要是关于细分,但您可以查看代码以了解渲染是如何完成的。