您的位置:首页 > 运维架构

绘制带颜色的几何体

2016-04-27 16:46 387 查看
之前好不容易把只有框框的几何体补上了其应该有的面,可是仅仅做到了有面。。几何体只有单一的颜色,看起来就非常的聒噪,从现在开始找给几何体上色的方法,简单的绘制方法应该是说非常的简单【看起来多么像句废话

我加入了一段表示颜色的矩阵代码

GLfloat colors[][3] = {
{ 1.0, 0.0, 0.0 },
{ 1.0, 1.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0 },
{ 0.0, 0.0, 1.0 },
{ 0.0, 0.5, 0.0 },
{ 0.0, 0.5, 0.5 },
};
分别来表示六个面的颜色,再加上在绘制之前调用颜色函数即可

#include<GL/GLUT.H>
#include <windows.h>
#include <math.h>
#include <gl/GL.h>

static const GLfloat vertex_list[][3] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
};

GLfloat colors[][3] = {
{ 1.0, 0.0, 0.0 },
{ 1.0, 1.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0 },
{ 0.0, 0.0, 1.0 },
{ 0.0, 0.5, 0.0 },
{ 0.0, 0.5, 0.5 },
};

static const GLint index_list[][4] = {
0, 1, 2, 3,//bottem
0, 3, 7, 4,//left
2, 3, 7, 6,//front
1, 2, 6, 5,//right
0, 1, 5, 4,//back
4, 5, 6, 7//top
};

void myDisplay(void){
glShadeModel(GL_SMOOTH);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glRotatef(45, 1, 1, 1);
glFrontFace(GL_CCW);

for (int i = 0; i < 6; ++i)      // 有六个面,循环六次
{
glColor3f(colors[i][0], colors[i][1], colors[i][2]);
glBegin(GL_POLYGON);
for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次
glVertex3fv(vertex_list[index_list[i][j]]);
glEnd();
}

glColor3f(1, 0, 0);
for (int i = 0; i < 6; ++i)      // 有六个面,循环六次
{
glBegin(GL_LINE_LOOP);
for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次
glVertex3fv(vertex_list[index_list[i][j]]);
glEnd();
}

glFlush();
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("opengl1");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}




很简单吧。问题是这样看起来有点小难看

看到网上有的图把立方体他们画的比较漂亮了,主要是用了颜色渐变blabla的。

为了简化问题,把立方体上的事情放到平面上先来看

问题比较简单,直接上代码

#include<GL/GLUT.H>
#include <windows.h>
#include <gl/GL.h>

void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT );
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);//颜色设置为白色
glVertex3f(-0.5f, -0.5f, -0.5f );

glColor3f(1.0, 1.0, 0.0);//颜色设置为黄色
glVertex3f(0.5f, -0.5f, -0.5f );

glColor3f(1.0, 0.0, 0.0);//颜色设置为红色
glVertex3f(0.5f, 0.5f, -0.5f );

glColor3f(1.0, 1.0, 1.0);//白色
glVertex3f(-0.5f, 0.5f, -0.5f);
glEnd();

glFlush();
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("opengl1");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
} 效果如下



可以看得出来。颜色是插值的,也就是渐变的

因为是四边形,所以glShadeModel(GL_FLAT);  

如果加上去的效果也是没啥用,如果是利用三角形绘制多边形的话就会有用,具体见https://www.opengl.org/sdk/docs/man2/xhtml/glShadeModel.xml

参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。

在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。

   

两种颜色方式对比
GL_SMOOTHGL_FLAT


哈哈,搞定颜色【基本上。下次开始学习关于光照和材质的,加油↖(^ω^)↗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl 图形