强烈感谢豆豆,一句话让我明白很多。
最近发生很多不顺心的事,看似没有关联的事情,跟这个都有关系,以前的确太凭兴趣了。
1.项目组的进度滞后
2.电工实习
3.C语言的课设
[项目]:项目组的进度滞后跟这个有很大关系的。做一个工程的话并不是只coding就可以的。还有很多,比如文档编写,搜集资料,做实验,想方案,还有一些很零碎的工作。并且这些工作都是很重要的,总要有人做的。这个我该反省一下了,来组里之后,零碎工作基本上没怎么做。组里的人通常有这样的倾向:总只关心提高自己的技术,而对于项目整体并不是那么关心。或者说把除coding之外的事情看得都很低级。
其实以前我也是完全按兴趣做事的人,怎么说呢,有点自私,太过于爱自己了。其实有些别的概念同样很重要的,比如责任,responsibility。仅有兴趣是很难完成一项工程的,中间遇到的困难和工程里你没有兴趣的那部分会阻止你的,这个时候Sense of responsibilty就很重要了。
其实以前xbull也谈过这个问题的,他说有兴趣是好的,但是他并不怎么相信兴趣。
我到现在仍然很相信兴趣,我只是觉得没有它的话不行罢了,但是在软件工程中team的成员都只凭兴趣做事会带来灾难的。
未完,有点事,一会儿再写
2006年10月15日
不能只凭兴趣做事啊
2006年10月4日
Shadow Volume详解(2)
然后重设模板测试比较函数:glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
绘制阴影体的所有背向视点的面
也就是当片于通过模板测试时,相应的模板缓存区域的值减一。接着红色区域+棕色区域的那个四边形被渲染。但是这个四边形位于红色的三角形的背后的部分无法通过深度测试,那个区域片元的位置比三角形离视点更远。
左图中棕色区域的模板缓存相应位置的值减1。经过这两次渲染,模板缓存中不为0的地方就是右边的淡蓝色区域减左边的棕色区域。
那个区域就是棕色区域下面的三角形区域,也就是阴影区。
实际上标准的做法是把场景渲染两遍的,这个下面我会翻译。现在使用的是NeHe的做法,直接给整个屏幕蒙上一个蒙板,非阴影区颜色不变,阴影区颜色加深。
然后就可以恢复OpenGL状态机设置,绘制物体本身。
glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
//draw a shadowing rectangle covering the entire screen
glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
//将当前矩阵load indentity后,绘制任意大小的矩形都将覆盖整个屏幕。
//xophiix告诉我,我才想起来的
glLoadIdentity();
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-0.1f, 0.1f, -0.10f);
glVertex3f(-0.1f, -0.1f, -0.10f);
glVertex3f( 0.1f, 0.1f, -0.10f);
glVertex3f( 0.1f, -0.1f, -0.10f);
glEnd();
glPopMatrix();
标签(分类) Graphics/OenGL
2006年10月3日
Shadow Volume详解(1)
利用每天夜里的一部分时间写一下,这也是热爱吧。主要是翻译reference(1)里的,也讲一下Nehe的实现。现在使用的还是z-pass方法,以后会把z-fail,Nvidia 的改进z-pass乃至soft shadow加进来。
感谢两个人的话:
DancingWind:如果我能让读者在读我的书的时候节省一分钟,那么这个班上有60个同学,我就节约了一个小时。好的教程往往可以事办功倍。
Emilmatthew:让更多人受益。
虽然我能力所限做不出好的教程,但是会尽力的。
Reference:
(1).Volume Shadows Tutorial by John Tsiombikas
(2).Nehe OpenGL tutorial:lesson 27 by Nehe
Steps:
[1]原理
[原理]首先,讲一下阴影体原理
我会尽我所能的讲得清楚一些,但是我仍然希望读者队模板缓存(stencil buffer),深度(depth)有基本得了解。我自己得学习过程也遇到很多困难,所得到得经验就是要先把原理弄明白,而不是急于看别人写好的code。
这个图是很理想的,足够简单又能说明原理。黄色的点代表光源,红色的平面代表一个三角形的物体,紫色,蓝色,棕色的平面就是构成阴影体的面(实际上这三个面应该在被离光源的方向上继续延长的,现在还是继续使用它吧)。灰色的代表阴影投射到的平面。
我们一边渲染一边讲:
[首先把要绘制阴影之外的物体绘制],这也是一个原则阴影物体要最后被绘制,这样做的目的是为了获取深度信息。深度:depth也就是物体离视点的距离,深度信息通常用做遮挡判断。比如在三维空间里绘制了一前一后两个平面,就要通过深度信息来判断两个平面的前后位置,进而其中一个平面判断那些位置被遮挡了。绘制完成之后屏幕上每点的深度值都已经确定下来,然后使深度缓存不可写
比如:glDepthMask(GL_FALSE);(DX下有类似的做法)
但是允许深度测试:glEnable(GL_DEPTH_TEST);
测试函数为:glDepthFunc(GL_LEQUAL);
也就是说只有深度小于原象素的象素才会被接受。
[然后绘制阴影体]
先清空模板缓存:glClearStencil(0);
开启模板缓存测试:glEnable(GL_STENCIL_TEST);
设置测试比较函数为: glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
然后设置片元通过或者未通过模板测试时如何队模板缓存中的数据进行更改: glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);也就是通过测试时增1。
然后绘制阴影体的所有朝向你的面,阴影体是这样形成的,以光源为一个顶点,物体边缘的一条边为边的三角形无限延伸所形成的四边形(理论上讲应该是一个无限的,但实际上长用一个足够长的来模拟),本例中就是紫色和蓝色的面。容易发现,这两个面上的所有片元都可以通过测试
相对应位置的模板缓存的值都会加1。
但是相应位置的深度信息不变,因为深度缓存被设置为不可写。
结果如右图所示:淡蓝色的区域模板缓存值增1。
标签(分类) Graphics/OenGL
2006年10月2日
反省
现在项目遇到了很大的困难, 或者说有很大的危险,该反思一下了。本来昨天就该写的,惰性又发作了。
从来没想过要追求完美,拿到任务就开始做,做到能用的程度就停下来休息。其实有很多东西都可以做得更好的。惰性一直没有克服。
自私,从暑假实习开始,就开始研究一些项目用不到但自以为很cool的东西。没有大局意识,也没有软件工程的意识。也没有关心过识别方面的事情。
骄傲,OpenGL好像很久都没有进步了。始终无法以始为终,最近才开始给自己订计划。如果热爱的东西都做不好的话,那就不能忍了。好在有realdodo,C++方面还学了一些东西。
post:晚上又开了会,刘老师也说了很多鼓励的话。虽然后面还有很多事情要做,但是大家都有passion了,都有想象力了,还有团结,这才是最重要的。
唉,做错了的事就无法挽回啊。