OpenGL学习之路

来源:互联网 发布:不可抗力网络剧01集 编辑:程序博客网 时间:2024/06/14 14:19

我是跟着这个教程学的http://download.csdn.net/detail/wd1603926823/9368086

鱼眼校正---拼接融合-----全景漫游,前两步都过了一下,在泊松融合上停留了差不多一个月,拖了太久,从昨天开始决定踏入第三步全景漫游,首先学习OpenGL,昨天基本上找了一天资料,然后用VC++6.0配置OpenGL,我是按照http://blog.csdn.net/makenothing/article/details/8451573这个人的进行配置的,全部配置好后,运行这个test程序,结果还是显示说没有glut.h这个头文件   我明明配置的时候放进GL文件夹里了啊:


这个再想想  不配置好就不能继续往下学了  肯定要实践的  另外我买了本蓝宝书  不知道怎样 还没到

http://wiki.jikexueyuan.com/project/modern-opengl-tutorial/这个资料不错http://learnopengl-cn.readthedocs.org/zh/latest/   https://github.com/cybercser/OpenGL_3_3_Tutorial_Translation

我改用了VS2013配置,终于配置成功了哈哈:


VS2013的界面果然够酷炫 这就是为什么我一定要装个比2010高的版本  除了因为我的VS2010配置了OpenCV2.4.9 我怕哪天因为我手贱乱删了什么崩溃导致我所有程序没了   还因为这个全黑的界面   多么酷炫啊哈哈!终于可以跟着教程实践学OpenGL了  好开森!!!

第二课是讲绘制点、直线和多边形,实现了几个例子:


书上没有根号 居然出来也是个五角星  其实应该用数学算是有根号的


这是本来是两个点  但OpenGL默认大小是一个像素  所以根本看不出来  其实是有的

第三课进的是几何图形绘制的细节:

这是将点的大小改变了显示出来的效果   

绘制的正面、反面的多边形     下面是画虚线

下面是剔除多边形的表面:



第四课开始讲颜色了  用彩色画矩形  用指定颜色清除屏幕(其实就是把整个屏幕变成那个颜色):


第五课和第六课的 那个绘制太阳系以及显示太阳、地球、月亮的动画 都显示不出来 显示出来的窗口上面什么都没有??  只显示坐标出来了:



但是定义的那个窗口本该出现动画的 却没出现  不知道为什么??

第七课开始讲光照了,实例部分是地球围绕太阳转 光线的变化:

是一个动画 用了上节课的动画的一点知识  结合这节课的光源的设置、材质设置等  感觉好好玩啊 

第八课开始讲显示列表了   实例是绘制一个旋转的正四面体 宏定义那里居然还用了一个do while的循环  我之前都没见过这种宏定义 后面居然还用到了堆栈  那里没看太懂  按照教程的用ColorY[]为别的面着色时 本来应该是黄色 结果却  会报错  所以我改了下:


我没有用ColorY[] 因为会报错  这也是一个小动画 用到了之前学的动画效果   otherwise,我的OpenGL蓝宝书到了,翻看了下,比较适合我这种fish,我准备看完这个教程就去看蓝宝书!                这一课后面说这个立体感不强  添加光照会比较有立体感  于是我这样加的:

#include<GL/glut.h>
#define WIDTH 400
#define HEIGHT 400
#include<math.h>
#define ColoredVertex(c,v) do{glColor3fv(c);glVertex3fv(v);} while(0) 
GLfloat angle = 0.0f;
void myDisplay(void)
{
static int list = 0;
if (list == 0)
{
GLfloat PointA[] = { 0.5f, -sqrt(6.0f) / 12, -sqrt(3.0f) / 6 }, PointB[] = { -0.5f, -sqrt(6.0f) / 12, -sqrt(3.0f) / 6 }, PointC[] = { 0.0f, -sqrt(6.0f) / 12, sqrt(3.0f) / 3 }, PointD[] = { 0.0f, sqrt(6.0f) / 4, 0 };
GLfloat ColorR[] = { 1, 0, 0 }, ColorG[] = { 0, 1, 0 }, ColorB[] = { 0, 0, 1 };
list = glGenLists(1);
glNewList(list, GL_COMPILE);
glBegin(GL_TRIANGLES);
ColoredVertex(ColorR, PointA);
ColoredVertex(ColorG, PointB);
ColoredVertex(ColorB, PointC);
ColoredVertex(ColorR, PointA);
ColoredVertex(ColorB, PointC);
ColoredVertex(ColorG, PointD);

//这里还有一个面的。。。
ColoredVertex(ColorG, PointB);
ColoredVertex(ColorR, PointA);
ColoredVertex(ColorB, PointD);
glEnd();
glEndList();
glEnable(GL_DEPTH_TEST);
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix(); 
glRotatef(angle, 1, 0.5, 0);
glCallList(list);
glPopMatrix();
//下面是我自己加的创造光照效果让旋转的正四面体更立体
GLfloat centerposition[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat centerambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat centerdiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat centerspecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, centerposition);
glLightfv(GL_LIGHT0, GL_AMBIENT, centerambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, centerdiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, centerspecular);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);

glutSwapBuffers();
}
void myIdle(void)
{
++angle;
if (angle >= 360.0f)
angle = 0.0f;
myDisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(200, 200);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("the 8th");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}

可是结果 却成了灰色的样子:这到底是有光照还是没光照  我眼瞎了看不出来啊!怎么还成了灰色?

第九课 开始讲混合了 实现半透明的效果  实例是二维图形的混合:

原来第一个绘制的是第二个参数对应的   第二次绘制的是第一个参数对应的       后来还举例绘制三维图形:

堆栈我还是不知道什么时候用  我感觉不需要用它也用了   这个程序里还加入动画部分的 双缓冲技术 以及后面的交换指针   但出来又是静态的没动画   所以我想着是不是像第一课那样绘制就行了 反正出来没动画效果  所以我试了下  结果真的可以  和上面加动画的一样   不知道作者加动画干嘛的  干脆不加好了:

这样出来也是一样。

第十课开始讲读取bmp文件(实现屏幕截图)、绘制像素、复制,之前按照书上的说法以及实例我老师找不到 出来总是exit(0)强制退出了  没结果  然后工程目录下也找不到

这个屏幕截图的 就是把显示窗口的图片保存下来  原来要先创建一个bmp文件  我创建的是一个我随手画的:

这个是画的师父,嘿嘿把他画成了这样嘿嘿,然后保存为shifu.bmp放在这个工程目录的下一级(如果不是下一级 就读不到  没结果  这和OpenCV不同 OpenCV是直接放到这个工程目录下就好  OpenGL还有放到更下一级 也许这就是它默认的放的地方) 这个生成的grap.bmp也是在这个目录下。然后绘制像素这个实例也是我随手画的xm.bmp然后窗口绘制出来:

嘿嘿这是一只外星小狗!

复制像素的这个例子显示出来的是一个白屏幕?为什么白屏呢?但是结果还是保存进目录了  通过照片查看器可以看到:


圣诞出去玩儿了。。。。。。第十一课  开始讲纹理了    这个实例是要实现这个效果:

实现这个纹理效果  很神奇啊纹理     结果报错  grap()和load_texture()这两个函数里报错:

报错说grap里三个打开文件的fopen要换成fopen_s  另外就是load_texture这个函数里glGetIntegerv()的第二个是GLuint不是GLint类型  我强制把第二个实参转换成GLint 结果也不行    教程里这一课是这里写错了??? 

今天又重新改了下  第二个参数那里不强制转换  而是在定义时就把它定义成GLint   结果终于没error了   可是出来却是这样:

黑白的?!形状可以看到是想要的那个效果的雏形  但怎么没颜色了   难道因为我改了定义被截断了?

第十二课 三种测试 其中一个实例是透过相框看一张图片:

透过右边的相框看左边这幅图 alpha检测   结果却是:

不对!为什么呢?我想想     不过第二个实例的倒是正确的,绘制一个类似湖面倒影的演示:



4 0
原创粉丝点击