您的位置:首页 > 编程语言

OpenGL 编程指南

2013-03-15 18:29 381 查看
(美)DaveShreinerTheKhronosOpenGLARBWorkingGroup2011机械七版.

openglwiki :http://www.opengl.org/wiki/Main_Page

3.0的APIhttp://www.opengl.org/documentation/specs/glut/spec3/node1.html

\4.2的API只能网上看,下载要会员,稍有郁闷,暂不看.

anyquestion:http://www.opengl.org/

Robin:http://www.xmission.com/~nate/tutors.html

red-bookofficialsite:http://www.opengl-redbook.com/

红宝书的附带程序:http://freeglut.sourceforge.net/

偶然发现个高级图形学,密歇根大学计院的http://www.cse.msu.edu/~cse872/

其它有助于学习的资源在http://www.opengl.org/resources/

http://3dgep.com/?cat=11

第五章光照

环境光影响整体颜色,直接照射,散射颜色占主导,因此只有当物体没有被直接照射时,环境颜色才主重要地位.和散射光一样,环境颜色不受观察点影响.

对于现实世界,环境光和散射光通常设置为一样.

镜面反射产生亮点,并取决于观察点位置,

发射光颜色,

 

第六章混合/抗锯齿和多边形偏移

OPENGL安装glew库的一个小问题.

http://blog.csdn.net/xiajun07061225/article/details/6938740

 

#error: gl.hincludedbeforeglew.h 

glew.h要在glut.h之前引入.

一个诡异的问题:

在调试"颜色索引模式下的抗锯齿"时程序调试不出来:

glut:fatalerrorinc:pixelformatwithnecessarycapabilitiesnotfound

不知是因为显卡不支持.


又一个奇怪的问题:

 


[code]main(intargc,char**argv)
{
glutInit(&argc,argv);//显示模式初始化
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);//定义窗口大小
//glutInitWindowSize(0,0);//定义窗口位置
//glutInitWindowPosition(100,100);//创建窗口
glutCreateWindow("OpenGLVersion");
constGLubyte*name=glGetString(GL_VENDOR);//返回负责当前OpenGL实现厂商的名字
constGLubyte*biaoshifu=glGetString(GL_RENDERER);//返回一个渲染器标识符,通常是个硬件平台
constGLubyte*OpenGLVersion=glGetString(GL_VERSION);//返回当前OpenGL实现的版本号
constGLubyte*gluVersion=gluGetString(GLU_VERSION);//返回当前GLU工具库版本
//constGLubyte*acceptStereo=glGetBooleanv(GL_STEREO,);
printf("OpenGL实现厂商的名字:%s\n",name);
printf("渲染器标识符:%s\n",biaoshifu);
printf("OOpenGL实现的版本号:%s\n",OpenGLVersion);
printf("OGLU工具库版本:%s\n",gluVersion);
system("pause");
return0;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}[/code]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

这段代码竟然无视我定义的窗口,怎么才让它用上呢/

第九章纹理

记住:纹理坐标必须在RGBA模式下使用.

GL_RGB和GL_RGBA是有差别的.

 

teaport:



第十章帧缓冲区(

明天一定要看完这本!

 

 

 


[code]

//opengl10.1.cpp:


//使用模板缓冲区

 


#include"stdafx.h"


#include<GL/glut.h>




#defineYELLOWMAT1


#defineBLUEMAT2

 


voidinit()


{


GLfloatyellow_diffuse[]={0.7,0.7,0.0,1.0};


GLfloatyellow_specular[]={1.0,1.0,1.0,1.0};

 


GLfloatblue_diffuse[]={0.1,0.1,0.7,1.0};


GLfloatblue_specular[]={0.1,1.0,1.0,1.0};

 


GLfloatposition_one[]={1.0,1.0,1.0,0.0};




glNewList(YELLOWMAT,GL_COMPILE);//显式列表


glMaterialfv(GL_FRONT,GL_DIFFUSE,yellow_diffuse);//材料属性,向量版本


glMaterialfv(GL_FRONT,GL_SPECULAR,yellow_specular);


glMaterialf(GL_FRONT,GL_SHININESS,64.0);//非向量版本的只用于设置GL_SHININESS


glEndList();

 


glNewList(BLUEMAT,GL_COMPILE);


glMaterialfv(GL_FRONT,GL_DIFFUSE,blue_diffuse);


glMaterialfv(GL_FRONT,GL_SPECULAR,blue_specular);


glMaterialf(GL_FRONT,GL_SHININESS,45.0);


glEndList();




glLightfv(GL_LIGHT0,GL_POSITION,position_one);//创建光源,浮点向量,指定坐标位置

 


glEnable(GL_LIGHT0);


glEnable(GL_LIGHTING);


glEnable(GL_DEPTH_TEST);

 


glClearStencil(0x0);//清除模板缓冲区


glEnable(GL_STENCIL_TEST);




}


/*画一个球在两环之间的钻石形中间的窗中.


*/


voiddisplay()


{


glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);


glStencilFunc(GL_EQUAL,0x1,0x1);//模板测试函数


glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);//模板测试操作


glCallList(BLUEMAT);


glutSolidSphere(0.5,15,15);//半径,经线,纬线?


glStencilFunc(GL_NOTEQUAL,0x1,0x1);




glPushMatrix();


glRotatef(45.0,0.0,0.0,1.0);//模型变换,当前矩阵与一个移动坐标矩阵相乘,以逆时针从原点到(x,y,z)的直线旋转.这里相当于绕z旋转45度.


glRotatef(45.0,0.0,1.0,0.0);//再绕y转45


glCallList(YELLOWMAT);


glutSolidTorus(0.275,0.85,15,15);//内径,外径,密度边数,圆似度.


glPushMatrix();


glRotatef(90.0,1.0,0.0,0.0);


glutSolidTorus(0.275,0.85,15,15);


glPopMatrix();


glPopMatrix();


glFlush();//花了我半小时.


}

 


/*不管窗口是否重绘,重新确定坐标系统,重绘模板区


*/

 


voidreshape(intw,inth)//GLUT传递的绘区窗口宽高像素数.


{


glViewport(0,0,(GLsizei)w,(GLsizei)h);


//画个钻石形的模板区


glMatrixMode(GL_PROJECTION);


glLoadIdentity();


if(w<=h)//二维图像投影到二维屏幕,如果窗宽比高小,右上角需要按高宽比调整


gluOrtho2D(-3.0,3.0,-3.0*(GLfloat)h/(GLfloat)w,3.0*(GLfloat)h/(GLfloat)w);


else//如果宽比高大,需要把左下角按比例调整.


gluOrtho2D(-3.0*(GLfloat)w/(GLfloat)h,3.0*(GLfloat)w/(GLfloat)h,-3.0,3.0);


glMatrixMode(GL_MODELVIEW);


glLoadIdentity();




glClear(GL_STENCIL_BUFFER_BIT);//清除指定的缓冲区


glStencilFunc(GL_ALWAYS,0x1,0x1);//比较函数,参考值,掩码(比较只在掩码为1的位上进行)


glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);

 




glBegin(GL_QUADS);//菱形


glVertex2f(-1.0,0.0);


glVertex2f(0.0,1.0);


glVertex2f(1.0,0.0);


glVertex2f(0.0,-1.0);


glEnd();




glMatrixMode(GL_PROJECTION);


glLoadIdentity();


gluPerspective(45.0,(GLfloat)w/(GLfloat)h,3.0,7.0);


glMatrixMode(GL_MODELVIEW);


glLoadIdentity();


glTranslatef(0.0,0.0,-5.0);



 




}

 


int_tmain(intargc,char**argv)


{


glutInit(&argc,argv);


glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH|GLUT_STENCIL);




glutInitWindowSize(400,400);


glutInitWindowPosition(110,110);


glutCreateWindow("Ms.white");


init();


glutReshapeFunc(reshape);


glutDisplayFunc(display);


glutMainLoop();


return0;


}

[/code]

我了个擦~!(陈其峰语)我记得个GLUT出现白屏的原因,有没人是忘记强制刷新的!!!

那么.相反的情况(不强制)是如何刷新的呢?

\

.景深的效果,很有感觉~~~~~~~



 

 

 

 

\做事要有头脑,瞎忙碌没有用.学习亦当如此.\

 

 

 

\OPENCV人脸识别,下周做这个,http://blog.csdn.net/feiwei/article/details/4261888

 

\问题; glGenFramebuffers无定义,即引用了glew包,glew32.lib.网上查了下要加EXT后缀,这个什么东东?然后呢,,,

还是不行,0x00000000处有未经处理的异常:0xC0000005:Accessviolation


不但没成,还变成犯罪了.继续纠结中...

这个老兄博客写得不错(但与此无关)http://blog.csdn.net/dizuo/article/details/8364003

 

\glBlendFunc

http://msdn.microsoft.com/en-us/library/ms537046

十一章分格化和二次方程表面

 

\不能将参数3从“void(__stdcall*)(constGLdouble*)”转换为“void(__stdcall*)(void)”

其实主要原因是在进行强制类型转换的时候,在C++和C语言中是有区别的,所以c++就报错的。(void(__stdcall*)())

解决方法如下:http://hi.baidu.com/zhujianzhai/item/6ed52336d67e7b9ab80c03eb

gluTessCallback(tobj,GLU_TESS_VERTEX,(void(__stdcall*)())glVertex3dv);

gluTessCallback(tobj,GLU_TESS_BEGIN,(void(__stdcall*)())beginCallback);

gluTessCallback(tobj,GLU_TESS_END,(void(__stdcall*)())endCallback);

gluTessCallback(tobj,GLU_TESS_ERROR,(void(__stdcall*)())errorCallback);

 

 

 

 

十二章求值器和NURBS

 

 

\今天看不完

 











只能这样了,明天要准备开题的事儿~~~~~~~GL我们来日方长吧,


十三章选择和反馈

十四章高级技巧

十五章着色语言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航