Opengl 入门,学习网站,常用函数详解 (gluproject,gluUnProject,glReadPixels)

Opengl

学习网站

想要系统的学,推荐learnopengl网站官网链接.,同时可以看工具书《OpenGL编程指南(第8版)》

目前市面上的教程,大部分是针对新版本的opengl,即核心渲染模式,核心渲染模式更灵活也更难,因项目需要,我目前只是紧急的学习了opengl1.0+版本的简单操作,以后有机会的话再学习3.3版本的。

入门理解

opengl是一个渲染工具库,我们能操作的只用两种,一种是设置函数,一种是使某个设置生效函数

glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

如上述两个,一个设置了clear清除动作时候用什么颜色清除,第二行表示开始clear这个动作,清除的对象就是GL_COLOR_BUFFER_BIT,即颜色缓冲池

简单绘制

在1.0+版本中,绘制几何图形非常简单,通过glbegin开始,glend结束,中间写需要的数据点,通过不同的绘制模式,来绘制不同的几何形状:

glBegin(GLenum mode);
glVertex3d(x,y,z);
glEnd();

常用的绘制模式有:
GL_POINTS 画离散的点
GL_LINES 画线(每两个点连成一条线)
GL_LINE_STRIP 画线(所有点相互相连,首尾不相连)
GL_LINE_LOOP 画线(所有点相互相连,首尾相连)
GL_POLYGON 填充面(将所有点围成的面进行填充)
GL_QUADS 填充面(将每四个点围成的面进行填充,相邻点之间不填充)
GL_QUAD_STRIP 填充面(每两个点构成一条线,每两个线构成一个四边形)
GL_TRIANGLES 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间不填充)
GL_TRIANGLE_STRIP 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间填充)
GL_TRIANGLE_FAN 填充三角形(以第一个点为顶点,之后每两个点合起来围成的三角形进行填充,相邻的点之间填充)
在这里插入图片描述

理解世界坐标、窗口坐标

这一节建议仔细看learnopengl网站,坐标系统这一章节,教程链接: link.
个人理解:
所有的工作目的,都是为了将一个我们构建的3d世界,在2d的电脑屏幕上合理地显示出来。其中有三个主要的矩阵,通过改变这些矩阵,能做到控制展示的效果。
一般通过改变GL_MODELVIEW矩阵,来旋转、平移、缩放世界中的物体
一般通过改变GL_PROJECTION矩阵,来改变投影的效果
opengl会时刻维护这两个矩阵,提供的关于矩阵的操作函数,都是对于当前矩阵来说的,如果想用一个矩阵乘modelview矩阵,那么需要先把modelview矩阵切换到当前矩阵,再使用乘法操作。
为了更好的理解坐标的问题,以下是一些实际例子讲解

// 创建了两个vector,用来保存opengl的两个矩阵
	std::vector<double> projectionmatrix;
	std::vector<double> modelviewmatrix;

glMatrixMode(GL_MODELVIEW);
// 切换当前矩阵为GL_MODELVIEW矩阵
glLoadIdentity();
// 设置当前矩阵为单位阵,即物体没有变化
glTranslated(0,0-2);
// 移动当前矩阵,沿z轴负向2单位,即站在0,0,0看,物体在0,0,-2
glGetDoublev(GL_MODELVIEW_MATRIX, &modelviewmatrix[0]);
// 获取当前的矩阵,并保存到自定义的modelviewmatrix
glMultMatrixd(&modelviewmatrix[0]);
// 乘法操作,这样操作会让modelviewmatrix矩阵与当前矩阵相乘
// 这一步操作没有实际意义,只是为了展示如何进行乘法操作
// 在我们需要时,可以将数据存到modelviewmatrix,再乘进当前矩阵
glMatrixMode(GL_PROJECTION);
// 切换当前矩阵为GL_PROJECTION矩阵

通过glVertex3d(x,y,z)这种方式设置的数据,opengl在获得了所有的数据之后,会按比例,把他们的坐标缩放到【-1,1】之间,初始时,所有数据构成的整体会在世界坐标(0,0,0)处,经过modelview矩阵,他们会被整体旋转平移,例如上例中,如果使用了glTranslated,他们就会被平移。
在经过裁剪、投影,最终会被呈现在我们的2d窗口上。具体投影、裁剪的过程,如果不设置不干预,opengl自己会做。

从鼠标窗口坐标到世界坐标转化

这是一个很常用的功能,展示一下标准代码 :

void SketcherInteractiveWindow::pick_point(int x, int y)
{
 // 这是我在qt里的程序,x,y是qt窗口获取到鼠标事件的,鼠标的x,y窗口坐标
	makeCurrent();
	// 这个函数是“激活”了当前opengl状态机,因为多线程情况下,要保证正确,调用这个函数,就能保证你现在做的操作,操作的是当前的opengl状态机
	glMatrixMode(GL_PROJECTION);
	glLoadMatrixd(&projectionmatrix[0]);
	glMatrixMode(GL_MODELVIEW);
	glLoadMatrixd(&modelviewmatrix[0]);
	// 把当前矩阵保存下来
	
	GLint viewport[4];
	glGetIntegerv(GL_VIEWPORT, viewport);	
	// 获取你的视口大小,注意,视口和窗口可能一致,可能不一致,opengl最后呈现在视口,qt是窗口坐标
	GLdouble winX = double(x);
	GLdouble winY = double(height() - y);
	// qt的xy方向和opengl xy方向不一致
	winY = winY / height() * viewport[3];
	// 这里是我的qt窗口和opengl视口大小不一样,我做了一个等比例修改
	GLfloat winZ = 0.0;
	glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
	// glReadPixels,功能是读取当前winx,winy下,世界里,第一个深度值
	// 怎么理解?当3d变成2d,会有深度的区别,这个函数能读取你鼠标指的那个位置的
	// 最前面的那个像素,返回winz的值
	double newx,newy,newz;
	gluUnProject(winX, winY, (GLdouble)winZ, &modelviewmatrix[0], &projectionmatrix[0], viewport, &newx, &newy, &newz);
	// 注意,这里winx、winy、winz都是上面的视口坐标
	// modelviewmatrix、projectionmatrix都是我上个例子给出的,我自己保存的opegnl两个矩阵
	// 整个函数的功能是,根据屏幕上面展示的坐标,倒退,找到世界坐标

}

视口、投影、裁剪

之后会把这节更新上,未完待续……

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先感谢各位的下载,这个文档是我自己整理的,由于函数太多,没办法一一详细的添加用法的中文翻译,还望大家见谅,里面写明了是中文分类。 如哪位朋友有中文的用法介绍可以提供给我,让你我一起完善这个中文的翻译工作! 有些朋友说给我骗了,你要知道整理这个文档我花了大量时间。已经非常的不容易了,我找了好多CHM文档都没有一个是我自己想要的。非常痛苦弄出来的!希望大家多多支持!! 中文分类 OpenGL函数汇总 ================================= 目前OpenGL函数主要包含在3个库中 1.GL 函数库 2.GLU 函数库 3.GLUT 函数库 1.GL函数 =================================== 颜色编辑 ------------------- glShadeModel 选择平面明暗模式或光滑明暗模式 void glShadeModel(GLenum mode) 参数:mode 指定表示明暗模式的符号值,可选 GL_FLAT 和 GL_SMOOTH ,缺省值为 GL_SMOOTH glColor 设置当前颜色 这是一个家族性质的函数集合,并没有glColor()这个函数。其包含的函数如下: void glColor3b(GLbyte red , GLbyte green , GLbyte blue) void glColor3d(GLdouble red , GLdouble green , GLdouble blue) void glColor3f(GLfloat red , GLfloat green , GLfloat blue) void glColor3i(GLint red , GLint green , GLint blue) void glColor3s(GLshort red , GLshort green , GLshort blue) void glColor3ub(GLubyte red , GLubyte green , GLubyte blue) void glColor3ui(GLuint red , GLuint green , GLuint blue) void glColor3us(GLushort red , GLushort green , GLushort blue) void glColor4b(GLbyte red , GLbyte green , GLbyte blue , GLbyte alpha) void glColor4d(GLdouble red , GLdouble green , GLdouble blue , GLdouble alpha) void glColor4f(GLfloat red , GLfloat green , GLfloat blue , GLfloat alpha) void glColor4i(GLint red , GLint green , GLint blue , GLint alpha) void glColor4s(GLshort red , GLshort green , GLshort blue , GLshort alpha) void glColor4ub(GLubyte red , GLubyte green , GLubyte blue , GLubyte alpha) void glColor4ui(GLuint red , GLuint green , GLuint blue , GLuint alpha) void glColor4us(GLushort red , GLushort green , GLushort blue , GLbyte alpha) 参数:red , green , blue 指定当前新的红、绿、蓝的颜色值 alpha 透明度,指明当前新的 alpha 颜色值 ,只有在 glColor4 函数中带4个变量时才会指定此参数。 此外还包括: void glColor3bv(const GLbyte * v) void glColor3dv(const GLdoble * v) void glColor3fv(const GLfloat * v) void glColor3iv(const GLint * v) void glColor3sv(const GLshort * v) void glColor3ubv(const GLubyte * v) void glColor3uiv(const GLuint * v) void glColor3usv(const GLushort * v) void glColor4bv(const GLbyte * v) void glColor4dv(const GLdoble * v) void glColor4fv(const GLfloat * v) void glColor4iv(const GLint * v) void glColor4sv(const GLshort * v) void glColor4ubv(const GLubyte * v) void glColor4uiv(const GLuint * v) void glColor4usv(const GLushort * v) 参数:v 指定一个值向包含红、绿、蓝和 alpha 值的数组指针。 glColorPointer 定义颜色数组 void glColorPointer(GLint size , GLenum type , GLsizei stride , GLsizei count , const GLvoid * pointer) 参数:size 每个颜色的分量数目 ,该值必须是3或4 type 在颜色数组中每个颜色分量的数据类型,可选的数据类型为: GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_UNSIGNED_FLOAT stride 相邻两个颜色的字节偏移量。当stride为零时 ,颜色值在数组中是一个接一个排列的。 count 静态颜色的数目 ,从第一个颜色开始计数。 pointer 指向颜色数组中第一个颜色元素中第一个分量的指针。 glIndex 设置当前颜色索引 void glIndexd(GLdouble c) void glIndexf(GLfloat c) void glIndexi(GLint c) void glIndexs(GLshort c) 参数: c 新的当前颜色索引值 void glIndexdv(GLdouble * c) void glIndexfv(GLfloat * c) void glIndexiv(GLint * c) void glIndexsv(GLshort * c) 参数: c 指向一个由单个元素组成的数组指针 ,该数组中包含新的当前颜色索引值。 glIndexPointer 定义颜色索引数组 void glIndexPointer(GLenum type ,GLsizei stride ,GLsizei count ,const GLvoid *pointer) 参数:type 数组中每个颜色索引的数据类型 ,可以选择的符号常数为:GL_SHORT GL_INT GL_FLOAT GL_DOUBLE stride 相邻的两个颜色索引的字节偏移量。当stride为零时 ,颜色索引值在数组中是一个接一个排列的。 count 颜色索引的数目,从第一个颜色开始计数 ,它们是静态的。 pointer 指向颜色数组中第一个颜色索引的指针。 glColorTableEXT 为目标调色板纹理指定调色板的格式和大小 void glColorTableEXT(GLenum target ,GLenum internalFormat ,GLsizei width ,GLenum format ,GLenum type ,const GLvoid *data) 参数:target 需要更改调色板的目标纹理 ,必须为 TEXTURE_1D TEXTURE_2D PROXY_TEXTURE_1D PROXY_TEXTURE_2D intenalFormat (等待编辑) width 调色板的大小 ,对于某些 n ,必须满足 2n>=1 . format (等待编辑) type data的数据类型 ,可选以下符号常量: GL_UNSIGNED_BYTE GL_BYTE GL_UNSIGNED_SHORT GL_SHORT GL_UNSIGNED_INT GL_INT GL_UNSIGNED_FLOAT GL_FLOAT data 指向调色板纹理数据的指针。对于调色板项目 ,数据作为一维纹理调色板项目中的单个像素进行处理。 glColorSubTableEXT 指定需要替代的目标纹理调色板的一部分 void glColorSubTableEXT(GLenum target ,GLsizei start ,GLsizei count ,GLenum format ,GLenum type ,const GLvoid * data) 参数:target 需要更改调色板的目标纹理 ,必须为 TEXTURE_1D TEXTURE_2D PROXY_TEXTURE_1D PROXY_TEXTURE_2D start 被改变的调色板的起始调色板索引项目。 count 被改变的调色板中从 start 开始的调色板索引项目的数目。count参数确定了被改变的调色板中调色板索引项目的范围。 format (等待编辑) type data的数据类型 ,可选以下符号常量: GL_UNSIGNED_BYTE GL_BYTE GL_UNSIGNED_SHORT GL_SHORT GL_UNSIGNED_INT GL_INT GL_UNSIGNED_FLOAT GL_FLOAT data 指向调色板纹理数据的指针。对于调色板项目 ,数据作为一维纹理调色板项目中的单个像素进行处理。 绘制几何图形 ----------------------------- glVertex glVertexPointer glArrayElement glBegin , glEnd glEdgeFlag , glEdgeFlagv glPointSize glLineWidth glLineStipple glPolygonMode glFrontFace glPolygonStipple glDrawElements glRect 坐标转换 ----------------------------- glTranslate glRotate glScale glViewPoint glFrustum glOrtho glClipPlane 堆栈操作 ------------------------------ glLoadMatrix glMultMatrix glMatrixMode glPushMatrix , glPopMatrix glPushAttrib , glPopAttrib glPushName , glPopName glInitName glLoadName 1.GL 函数库(续) =============================== 显示列表 ----------------------------- glNewList , glEndList glCallList glCallLists glGenLists glDeleteLists glIsList 使用光照和材质 ----------------------------- glNormal glNormalPointer glLight glLightModel glMaterial glColorMaterial 像素操作 ------------------------------ glRasterPos glBitmap glReadPixels glDrawPixels glCopyPixels glCopyTexImage1D glCopyTexImage2D glCopyTexSubImage1D glCopyTexSubImage2D glPixelZoom glPixelStore glPixelTransfer glPixelMap 纹理映射 ----------------------------- glTexImage1D glTexImage2D glTexParameter glTexSubImage1D glTexSubImage2D glTexEnv glTexCoord glTexGen glTexCoordPointer glDeleteTextures 特效操作 ---------------------------- glBlendFunc glHint glFog 1.GL函数(续2) ============================= 帧缓存操作 ----------------------------- glClear glClearAccum glClearColor glClearDepth glClearIndex glClearStencil glDrawBuffer glIndexMask glColorMask glDepthMask glStencilMask glAlphaFunc glStencilFunc glStencilOp glDepthFunc glDepthRange glLogicOp glAccum 曲线或曲面绘制 ------------------------------ glEvalCoord glMap1 glMap2 glMapGrid glEvalMesh glEvalPoint 查询函数 ----------------------------- glGet glGetClipPlane glGetColorTableEXT glGetColorTableParameterfvEXT , glGetColorTableParameterivEXT glGetError glGetLight glGetMap glGetMaterial glGetPixelMap glGetPointerv glGetPolygonStipple glGetString glGetTexEnv glGetTexImage glGetTexLevelParameter glGetTexParameter 2.GLU函数 ============================ 绘制 NURBS 曲线和曲面 ------------------------------ gluNewNurbsRenderer gluNurbsProperty gluNurbsCallback gluBeginCurve , gluEndCurve gluNurbsCurve gluDeleteNurbsRenderer gluBeginSurface , gluEndSurface gluNurbsSurface gluBeginTrim , gluEndTrim gluPwlCurve gluBeginPolygon , gluEndPolygon gluPickMatrix 绘制二次几何物体 --------------------------------- gluNewQuadric gluQuadricDrawStyle gluQuadricNormals gluQuadricOrientation gluCylinder gluSphere gluDisk gluPartialDisk gluDeleteQuadric gluQuadricTexture gluQuadricCallback 网格化 ------------------------------ gluNewTess gluTessVertex gluTessCallback gluTessBeginPolygon , gluTessEndPolygon gluTessBeginContour , gluTessBeginContour gluTessProperty gluNextContour gluTessNormal gluDeleteTess 坐标转换 ------------------------------ gluOrtho2D gluPerspective gluLookAt gluProject gluUnProject 多重映射 ------------------------------ gluBuild1DMipmaps gluBuild2DMipmaps gluScaleImage 查询函数 ----------------------------- gluErrorString gluGetNurbsProperty gluGetString gluGetTessProperty 3.GLUT 库函数 ============================= 初始化和启动事件处理 ------------------------- glutInit glutInitWindowPosition glutInitWindowSize glutInitDisplayMode glutMainLoop 窗口管理 ------------------------- glutCreateWindow glutCreateSubWindow glutHideWindow glutShowWindow glutSetWindowTitle glutPostRedisplay glutSwapBuffers glutFullScreen glutPositionWindow glutReshapeWindow glutSetWindow glutGetWindow glutPopWindow glutPushWindow glutDestroyWindow glutIconifyWindow glutSetCursor 重叠层管理 ------------------------- glutEstablishOverlay glutUseLayer glutRemoveOverlay glutPostOverlayRedisplay glutShowOverlay glutHideOverlay 菜单管理 ------------------------- glutCreateMenu glutAddMenuEntry glutAddSubMenu glutAttachMenu glutGetMenu glutSetMenu glutDestroyMenu glutChangeToMenuEntry glutChangeToSubMenu glutRemoveMenuItem glutDetachMenu 3.GLUT 库函数(续) =============================== 注册回调函数 ------------------------------- glutDisplayFunc glutReshapeFunc glutMouseFunc glutMotionFunc glutIdleFunc glutVisibilityFunc glutKeyboardFunc glutSpecialFunc glutOverlayDisplayFunc glutPassiveMotionFunc glutEntryFunc glutSpaceballMotionFunc glutSpaceballRotateFunc glutSpaceballButtonFunc glutButtonBoxFunc glutDialsFunc glutTableMotionFunc glutTableButtonFunc glutMenuStatusFunc glutTimerFunc 颜色索引映射表管理 ------------------------------- glutSetColor glutGetColor glutCopyColormap 状态检索 ------------------------------- glutGet glutLayerGet glutDeviceGet glutGetModifiers glutExtensionSupported 字体绘制 ------------------------------- glutBitmapCharacter glutBitmapWidth glutStrokeCharacter glutStrokeWidth 几何图形绘制 ------------------------------- glutSolidSphere , glutWireSphere glutSolidCube , glutWireCube glutSolidCone , glutWireCone glutSolidTorus , glutWireTorus glutSolidDodecahedron , glutWireDodecahedron glutSolidOctahedron , glutWireOctahedron glutSolidTetrahedron , glutWireTetrahedron glutSolieIcosahedron , glutWireIcosahedron glutSolidTeapot , glutWireTeapot

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值