绘制带颜色的几何体
2016-04-27 16:46
387 查看
之前好不容易把只有框框的几何体补上了其应该有的面,可是仅仅做到了有面。。几何体只有单一的颜色,看起来就非常的聒噪,从现在开始找给几何体上色的方法,简单的绘制方法应该是说非常的简单【看起来多么像句废话
我加入了一段表示颜色的矩阵代码
![](https://img-blog.csdn.net/20160427181050167?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
很简单吧。问题是这样看起来有点小难看
看到网上有的图把立方体他们画的比较漂亮了,主要是用了颜色渐变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;
} 效果如下
![](https://img-blog.csdn.net/20160428205336954?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看得出来。颜色是插值的,也就是渐变的
因为是四边形,所以glShadeModel(GL_FLAT);
如果加上去的效果也是没啥用,如果是利用三角形绘制多边形的话就会有用,具体见https://www.opengl.org/sdk/docs/man2/xhtml/glShadeModel.xml
参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。
在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。
两种颜色方式对比
哈哈,搞定颜色【基本上。下次开始学习关于光照和材质的,加油↖(^ω^)↗
我加入了一段表示颜色的矩阵代码
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_SMOOTH | GL_FLAT |
相关文章推荐
- 解决Vista系统OpenGL驱动问题的方法整理
- Delphi下OpenGL2d绘图之画四边形的方法
- Delphi下OpenGL2d绘图之画点的方法
- Delphi下OpenGL2d绘图之初始化流程详解
- C#实现图形位置组合转换的方法
- C#实现判断图形文件格式的方法
- C#实现图形路径变换的方法
- Delphi使用OpenGL2d绘图之画图片Bmp的方法
- php生成图形验证码几种方法小结
- CentOS的图形安装及初始环境设置教程
- 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸
- VC运用OPENGL加载BMP纹理图的实现方法汇总
- C#实现图形区域组合操作的方法
- php实现图形显示Ip地址的代码及注释
- Java Web开发之图形验证码的生成与使用方法
- android中图形图像处理之drawable用法分析
- Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)
- Android开发之图形图像与动画(五)LayoutAnimationController详解
- C++实现图形界面时钟表盘代码
- C++实现二维图形的傅里叶变换