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/
3.0的API
\4.2的API只能网上看,下载要会员,稍有郁闷,暂不看.
anyquestion:
Robin:
red-bookofficialsite:
红宝书的附带程序:
偶然发现个高级图形学,密歇根大学计院的
其它有助于学习的资源在
第五章光照
环境光影响整体颜色,直接照射,散射颜色占主导,因此只有当物体没有被直接照射时,环境颜色才主重要地位.和散射光一样,环境颜色不受观察点影响.
对于现实世界,环境光和散射光通常设置为一样.
镜面反射产生亮点,并取决于观察点位置,
发射光颜色,
第六章混合/抗锯齿和多边形偏移
OPENGL安装glew库的一个小问题.
#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人脸识别,下周做这个,
\问题; glGenFramebuffers无定义,即引用了glew包,glew32.lib.网上查了下要加EXT后缀,这个什么东东?然后呢,,,
还是不行,0x00000000处有未经处理的异常:0xC0000005:Accessviolation
不但没成,还变成犯罪了.继续纠结中...
这个老兄博客写得不错(但与此无关)
\glBlendFunc
十一章分格化和二次方程表面
\不能将参数3从“void(__stdcall*)(constGLdouble*)”转换为“void(__stdcall*)(void)”
其实主要原因是在进行强制类型转换的时候,在C++和C语言中是有区别的,所以c++就报错的。(void(__stdcall*)())
解决方法如下:
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我们来日方长吧,
十三章选择和反馈
十四章高级技巧
十五章着色语言
相关文章推荐
- OpenGL编程指南-光照
- OpenGL编程指南目录
- OpenGL 编程指南(第八版)学习笔记——2 着色器基础
- OpenGL 编程指南(第八版)学习笔记——5 视口变换、剪切与反馈
- OpenGL编程指南 代码
- OpenGL编程指南9:裁剪平面+glPushMatrix和glPopMatrix矩阵栈顶操作
- OpenGL 编程指南(第八版)学习笔记——6 纹理
- OpenGL编程指南13:光源移动
- OpenGL 编程指南笔记——第8章 OpenGL 绘制像素、位图、字体和图像
- opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书
- OpenGL编程指南--显示列表
- OpenGL 编程指南(第八版)学习笔记——1 OpenGL概述
- OpenGL编程指南---多边形正反面 剔除
- 【OpenGL编程指南】之投影和视口变换
- OpenGL编程指南---多边形正反面 剔除
- 【OpenGL编程指南】之视图和模型变换
- 《OpenGL》编程指南学习开篇
- OpenGL编程指南-环境搭建,渲染三角形
- OpenGL编程指南-->深度缓冲区原理以及为什么要用它
- OpenGL编程指南 (红宝书 第八版) 样例代码配置问题汇总