计算机程序设计
C:\Program Files (x86)\Windows Kits\8.0\Include\um\gl
矩形显示,左下右上
#include
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
void lineSegment(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINES);
glVertex2i(180,15);
glVertex2i(10,145);
glEnd();
glFlush();
}
void main(int agrc,char**argv)
{
glutInit(&agrc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(50,100);
glutInitWindowSize(400,300);
glutCreateWindow("Draw a Line");
init();
glutDisplayFunc(lineSegment);
glutMainLoop();
}
绘制任意一条给定方程的曲线
绘制棋盘
03SAT(补)不行还有书呢,怕什么
区域填充
1.X与Y看谁长的快,就设谁是1,另一个就会被限制,bresenam算法,一个方向上增减1,另一个方向增减0/1
2.八分画圆法
算法中d=5/4-r控制误差的原理
其实没有边界,有边界/无边界
1)漫水法
已知:图形函数(边界)(一定是围起来的闭合曲线吗?)、颜色
选取种子点→计算种子邻域(加减单位一得四个点)→判断邻域点是否在边界范围内(因为已知边界,易判断点在内/外然后判断是不是已经被填了/其他颜色,因为取了区域内的点,所以邻域点最多在边界上,嗯,判断这三个条件决定是否填充,这些要求、条件可以转换为一条→邻域点颜色是否为边界颜色,若所附颜色和边界颜色一样,但无妨,结果只有一个,就是不赋色这个点,因为已经填过/在边界上,反过来说,只有颜色为空的,才填色,但,边界的颜色一定有吗?
)
04THU
反走样技术
100w万像素→1000万像素
05thu
103/134
为什么结果是这的。。。。。
把图形换成自己的,自己应用旋转、平移得到一个图型形
/
#include
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0);//设置显示范围
glMatrixMode(GL_MODELVIEW);
}
void drawdiamond(void)
{
glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
glVertex2f(0.0f, -1.0f);//下
glVertex2f(2.0f, 0.0f);//右
glVertex2f(0.0f, 1.0f);//上
glVertex2f(-2.0f, 0.0f);//左
glEnd();
}
void myDraw(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glRotatef(120.0, 2.0, 0.0, 1.0);
glColor3f(0.0, 1.0, 0.0);
drawdiamond();
glPopMatrix();
glPushMatrix();
glRotatef(240.0, 2.0, 0.0, 1.0);
glColor3f(0.0, 1.0, 0.0);
drawdiamond();
glPopMatrix();
glPushMatrix();
glRotatef(120.0, 2.0, 0.0, 1.0);
glColor3f(0.0, 1.0, 0.0);
drawdiamond();
glPopMatrix();
glFlush();
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("竹叶×");
init();
glutDisplayFunc(myDraw);
glutMainLoop();
}
三维实体的构造,
1.满足欧拉公式
2.孔、洞、不相连的多面体,
C++:
using namespace std
所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙。
opengl里面的深度缓存
glcleardepth()
在现实生活中,一个实心物体挡在另外一个实心物体的前面, 后面的那个物体有部分会被遮盖掉
那么opengl里面如何模拟这个情况呢? 每个物体的每个像素都有一个深度缓存的值(在0到1之间,可以想象成是z轴的距离)
如果glDepthFunc启用了GL_LESS(现实生活中的前景), 那么当前个物体挡住后个物体时, 由于前个物体深度值小(越靠近人的), 所以它就被画了出来, 后面的物体被挡住的像素就被忽略掉了。(当然你如果启用了GL_GREATER, 那么情况就反过来了)
这个时候再来说glClearDepth, 它给深度缓冲指定了一个初始值,缓冲中的每个像素的深度值都是这个, 比如1,这个时候你往里面画一个物体, 由于物体的每个像素的深度值都小于等于1, 所以整个物体都被显示了出来。 如果初始值指定为0, 物体的每个像素的深度值都大于等于0, 所以整个物体都不可见。 如果初始值指定为0.5, 那么物体就只有深度小于0.5的那部分才是可见的
func值 |
含义 |
GL_NEVER |
不通过(输入的深度值不取代参考值) |
GL_LESS |
如果输入的深度值小于参考值,则通过 |
GL_EQUAL |
如果输入的深度值等于参考值,则通过 |
GL_LEQUAL |
如果输入的深度值小于或等于参考值,则通过 |
GL_GREATER |
如果输入的深度值大于参考值,则通过 |
GL_NOTE_QUAL |
如果输入的深度值不等于参考值,则通过 |
GL_GEQUAL |
如果输入的深度值大于或等于参考值,则通过 |
GL_ALWAYS |
总是通过(输入的深度值取代参考值) |
最后一行的GL_COLOR_MATERIAL使我们可以用颜色来贴物体。如果没有这行代码,纹理将始终保持原来的颜色,glColor3f(r,g,b)就没有用了。总之这行代码是很有用的。
激活GL_COLOR_MATERIAL可以让你在激活光照的情况下用glColor函数给物体上色。这个方法又称为颜色追踪。
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
真正精细的透视修正。这一行告诉OpenGL我们希望进行最好的透视修正。这会十分轻微的影响性能。但使得透视图看起来好一点。
关于glcolor*/glclearlolor()/的问题
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。
RGBA模式与索引模式的区别:
计算机必须为每个像素保存一些数据,在RGBA模式中数据就代表了颜色;而颜色索引模式中数据代表了一个索引,要获取真正的颜色值还需要查索引表。数据的数量是由帧缓存中的位面决定的。一个位面为一个像素的一个位的数据。假如是8位面的颜色,每个像素就有8个颜色位,因此就有2的8次方位,也就是256种不同的颜色值,或者说每个像素可以有256种颜色。位面通常分为RGB三个组成部分。
1)RGBA:
RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色。而alpha不直接影响颜色,alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的,而数值为100%则意味着一个完全不透明的像素。在0%和100%之间的值则使得像素可以透过背景显示出来,就像透过玻璃(半透明性),这种效果是简单的二元透明性(透明或不透明)做不到的,它使数码合成变得容易。alpha通道值可以用百分比、整数或者像RGB参数那样用0到1的实数表示。
PNG是一种使用RGBA的图像格式。
glColor*系列函数可以用于设置颜色:(常用颜色参考表:http://blog.sina.com.cn/s/blog_4e20daf60102dydy.html)
常用RGB颜色表
R |
G |
B |
值 |
R |
G |
B |
值 |
R |
G |
B |
值 |
|||
黑色 |
0 |
0 |
0 |
#000000 |
黄色 |
255 |
255 |
0 |
#FFFF00 |
浅灰蓝色 |
176 |
224 |
230 |
#B0E0E6 |
象牙黑 |
41 |
36 |
33 |
#292421 |
香蕉色 |
227 |
207 |
87 |
#E3CF57 |
品蓝 |
65 |
105 |
225 |
#4169E1 |
灰色 |
192 |
192 |
192 |
#C0C0C0 |
镉黄 |
255 |
153 |
18 |
#FF9912 |
石板蓝 |
106 |
90 |
205 |
#6A5ACD |
冷灰 |
128 |
138 |
135 |
#808A87 |
dougello |
235 |
142 |
85 |
#EB8E55 |
天蓝 |
135 |
206 |
235 |
#87CEEB |
石板灰 |
112 |
128 |
105 |
#708069 |
forum gold |
255 |
227 |
132 |
#FFE384 |
|||||
暖灰色 |
128 |
128 |
105 |
#808069 |
金黄色 |
255 |
215 |
0 |
#FFD700 |
青色 |
0 |
255 |
255 |
#00FFFF |
黄花色 |
218 |
165 |
105 |
#DAA569 |
绿土 |
56 |
94 |
15 |
#385E0F |
|||||
白色 |
255 |
255 |
255 |
#FFFFFF |
瓜色 |
227 |
168 |
105 |
#E3A869 |
靛青 |
8 |
46 |
84 |
#082E54 |
古董白 |
250 |
235 |
215 |
#FAEBD7 |
橙色 |
255 |
97 |
0 |
#FF6100 |
碧绿色 |
127 |
255 |
212 |
#7FFFD4 |
天蓝色 |
240 |
255 |
255 |
#F0FFFF |
镉橙 |
255 |
97 |
3 |
#FF6103 |
青绿色 |
64 |
224 |
208 |
#40E0D0 |
白烟 |
245 |
245 |
245 |
#F5F5F5 |
胡萝卜色 |
237 |
145 |
33 |
#ED9121 |
绿色 |
0 |
255 |
0 |
#00FF00 |
白杏仁 |
255 |
235 |
205 |
#FFFFCD |
桔黄 |
255 |
128 |
0 |
#FF8000 |
黄绿色 |
127 |
255 |
0 |
#7FFF00 |
cornsilk |
255 |
248 |
220 |
#FFF8DC |
淡黄色 |
245 |
222 |
179 |
#F5DEB3 |
钴绿色 |
61 |
145 |
64 |
#3D9140 |
蛋壳色 |
252 |
230 |
201 |
#FCE6C9 |
翠绿色 |
0 |
201 |
87 |
#00C957 |
|||||
花白 |
255 |
250 |
240 |
#FFFAF0 |
棕色 |
128 |
42 |
42 |
#802A2A |
森林绿 |
34 |
139 |
34 |
#228B22 |
gainsboro |
220 |
220 |
220 |
#DCDCDC |
米色 |
163 |
148 |
128 |
#A39480 |
草地绿 |
124 |
252 |
0 |
#7CFC00 |
ghostWhite |
248 |
248 |
255 |
#F8F8FF |
锻浓黄土色 |
138 |
54 |
15 |
#8A360F |
酸橙绿 |
50 |
205 |
50 |
#32CD32 |
蜜露橙 |
240 |
255 |
240 |
#F0FFF0 |
锻棕土色 |
135 |
51 |
36 |
#873324 |
薄荷色 |
189 |
252 |
201 |
#BDFCC9 |
象牙白 |
250 |
255 |
240 |
#FAFFF0 |
巧克力色 |
210 |
105 |
30 |
#D2691E |
草绿色 |
107 |
142 |
35 |
#6B8E23 |
亚麻色 |
250 |
240 |
230 |
#FAF0E6 |
肉色 |
255 |
125 |
64 |
#FF7D40 |
暗绿色 |
48 |
128 |
20 |
#308014 |
navajoWhite |
255 |
222 |
173 |
#FFDEAD |
黄褐色 |
240 |
230 |
140 |
#F0E68C |
海绿色 |
46 |
139 |
87 |
#2E8B57 |
old lace |
253 |
245 |
230 |
#FDF5E6 |
玫瑰红 |
188 |
143 |
143 |
#BC8F8F |
嫩绿色 |
0 |
255 |
127 |
#00FF7F |
海贝壳色 |
255 |
245 |
238 |
#FFF5EE |
肖贡土色 |
199 |
97 |
20 |
#C76114 |
|||||
雪白 |
255 |
250 |
250 |
#FFFAFA |
标土棕 |
115 |
74 |
18 |
#734A12 |
紫色 |
160 |
32 |
240 |
#A020F0 |
乌贼墨棕 |
94 |
38 |
18 |
#5E2612 |
紫罗蓝色 |
138 |
43 |
226 |
#8A2BE2 |
|||||
红色 |
255 |
0 |
0 |
#FF0000 |
赫色 |
160 |
82 |
45 |
#A0522D |
jasoa |
160 |
102 |
211 |
#A066D3 |
砖红 |
156 |
102 |
31 |
#9C661F |
马棕色 |
139 |
69 |
19 |
#8B4513 |
湖紫色 |
153 |
51 |
250 |
#9933FA |
镉红 |
227 |
23 |
13 |
#E3170D |
沙棕色 |
244 |
164 |
96 |
#F4A460 |
淡紫色 |
218 |
112 |
214 |
#DA70D6 |
珊瑚色 |
255 |
127 |
80 |
#FF7F50 |
棕褐色 |
210 |
180 |
140 |
#D2B48C |
梅红色 |
221 |
160 |
221 |
#DDA0DD |
耐火砖红 |
178 |
34 |
34 |
#B22222 |
||||||||||
印度红 |
176 |
23 |
31 |
#B0171F |
蓝色 |
0 |
0 |
255 |
#0000FF |
|||||
栗色 |
176 |
48 |
96 |
#B03060 |
钴色 |
61 |
89 |
171 |
#3D59AB |
|||||
粉红 |
255 |
192 |
203 |
#FFC0CB |
dodger blue |
30 |
144 |
255 |
#1E90FF |
|||||
草莓色 |
135 |
38 |
87 |
#872657 |
jackie blue |
11 |
23 |
70 |
#0B1746 |
|||||
橙红色 |
250 |
128 |
114 |
#FA8072 |
锰蓝 |
3 |
168 |
158 |
#03A89E |
|||||
蕃茄红 |
255 |
99 |
71 |
#FF6347 |
深蓝色 |
25 |
25 |
112 |
#191970 |
|||||
桔红 |
255 |
69 |
0 |
#FF4500 |
孔雀蓝 |
51 |
161 |
201 |
#33A1C9 |
|||||
深红色 |
255 |
0 |
255 |
#FF00FF |
土耳其玉色 |
0 |
199 |
140 |
#00C78C |
三原色光模式(RGB color model),又译 RGB颜色模型 或 红绿蓝颜色模型
是一种加色模型,是用三种原色──红色、绿色和蓝色的色光以不同的比例相加,以产生多种多样的色光。
RGB模型的命名来自于三种相加原色的首字母《Red(红),Green(绿),Blue(蓝)》。
RGB颜色模型的主要目的是在电子系统中检测,表示和显示图像,比如电视和电脑,但是在传统摄影中也有应用。在电子时代之前,基于人类对颜色的感知,RGB颜色模型已经有了坚实的理论支撑。
RGB是一种依赖于设备的颜色空间:不同设备对特定RGB值的检测和重现都不一样,因为颜色物质(荧光剂或者染料)和它们对红、绿和蓝的单独响应水平随着制造商的不同而不同,甚至是同样的设备不同的时间也不同。
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);设置当前帧的背景颜色
glClear(GL_COLOR_BUFFER_BIT);清除当前帧的颜色,也就是变成黑色背景,你先设置了当前帧的数据,然后马上就清除了,当然就没有了。所以你要把这两行代码调换顺序。
二:
void ReshapeFunc(int width, int height)//width和height是当前窗口的大小,
{
glViewport(0, 0, width, height);//设置图像显示窗口和当前系统窗口一样大小,使用参数width, height
glViewport(0, 0, 800, 600);//图像不随窗口的变化而变化。你用这个就行,但是如果系统窗口太小的话,图像会无法全部显示。
glColor3b,glColor4b glColor3s glColor4s,glColor3i,glColor4i需要3个或4个无符号字节,或长或短的整数作为参数。当v附加到该名称,颜色命令可以采取这种数值的数组的指针。
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
OpenGl的glMatrixMode()函数理解
2013年01月02日 22:16:32 jiangdf 阅读数:37054更多
个人分类: OpenGL
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理.
如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进行操作,也就是把物体投影到一个平面上,就像我们照相一样,把3维物体投到2维的平面上。这样,接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective();
在操作投影矩阵以前,需要调用函数:
glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影矩阵
然后把矩阵设为单位矩阵:
glLoadIdentity();
然后调用glFrustum()或gluPerspective(),它们生成的矩阵会与当前的矩阵相乘,生成透视的效果;
如果参数是GL_MODELVIEW,这个是对模型视景的操作,接下来的语句描绘一个以模型为基础的适应,这样来设置参数,接下来用到的就是像gluLookAt()这样的函数;
若是GL_TEXTURE,就是对纹理相关进行操作
顺便说下,OpenGL里面的操作,很多是基于对矩阵的操作的,比如位移,旋转,缩放,所以,这里其实说的规范一点就是glMatrixMode是用来指定哪一个矩阵是当前矩阵,而它的参数代表要操作的目标,GL_PROJECTION是对投影矩阵操作,GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。
切换当前矩阵.
如.要使用透视(3D).那么先要设置透视投影
glMatrixMode(GL_PROJECTION); //切换到投影矩阵.
//...设置透视投影
设置完成后开始画图,需要切换到 模型视图矩阵 才能正确画图.
glMatrixMode(GL_MODELVIEW);
// 画一个物体A (看起来是3D的),
// 如这时候需画一个 2D效果 的 物体A,那么又需要透视投影
glMatrixMode(GL_PROJECTION); //切换到投影矩阵..
// ..设置正交投影
//..设置完成,切换回模型视图矩阵.....
glMatrixMode(GL_MODELVIEW);
// 再画一个物体A (看起来是2D的)
// 如从头到尾都是画3D/2D, 只需初始化时设置一次.
// 如果有交替,那么就需要glMatrixMode() 切换
// 因这样设置很烦人,所以又有glPushMatrix() 保存当前矩阵
缓冲区颜色刷新:https://blog.csdn.net/nimeghbia/article/details/79851113