首页 技术经验

glGenerateMipmap

glGenerateMipmap gl Generate Mipmap
魔兔技术网为你分享关于《glGenerateMipmap》的相关技术文章,通过对glGenerateMipmap的学习,希望你能对glGenerateMipmap的相关知识:glGenerateMipmap,gl,Generate,Mipmap,有更深层次的理解,并对glGenerateMipmap学有所得!,下面是详细的技术问答讲解!
阅读数
783782
话题:glGenerateMipmap

mipmap是什么

mipmap是什么

【Mipmap】

MIP来源于拉丁文中的multum in parvo,意为在一个小空间里的多数。MIP map(有时候拼写成mipmap)是一种电脑图形图像技术,用于在三维图像的二维代替物中达到立体感效应。MIP map技术与材质帖图技术结合,根据距观看者远近距离的不同,以不同的分辨率将单一的材质帖图以多重图像的形式表现出来并代表平面纹理:尺寸最大的图像放在前面显著的位置,而相对较小的图像则后退到背景区域。每一个不同的尺寸等级定义成一个MIP map水平。MIP map技术帮助避免了不想要的锯齿边缘(称为锯齿状图形)在图像中出现,这种锯齿状图形可能是由于在不同分辨率下使用bit map图像产生的。

请参阅百度百科
http://baike.baidu.com/view/2342414.htm


Minecraft视频设置里的Mipmap级别是干什么的?调大调小有什么用?

Minecraft视频设置里的Mipmap级别是干什么的?调大调小有什么用?

Minecraft视频设置里的Mipmap级别是干什么的?调大调小有什么用?

调整图形锯齿的数量和图形渲染的速度。 mipmap指的是平面纹理的清晰程度。它是方块经过渲染之后显示的清晰程度。在同样的材质包,同样的显示器分辨率的情况下,mipmap等级越高,渲染后景物就越清晰。同时mipmap等级的高低还决定了电脑负担(主要是显卡、显存等)的大小;等级越高,越清晰,但是电脑的负担也就越大。 原理:MIPMAP方法相当于纹理LOD。当物体接近观察者的物体,使用高分辨率的MIPMAP图像:当物体逐渐远离观察者时,使用低分辨率的图像。 虽然内存消耗很大,但MIPMAP方法可以提高场景渲染质量。处理过程中,它将原始高分辨率纹理缩减为低分辨率的小纹理,缩减的方式是高度和宽度减半,并用减半后的值作为小纹理的尺度。 我的世界游戏视频是专门为Minecraft打造的一款我的世界游戏视频解说大全,提供我的世界热门主播马桶、陈子豪、橙子、籽岷等的视频解说,还有我的世界生存、搞笑、教学、攻略等视频。 1、拥有全网最全的我的世界游戏视频,聚合优酷、爱拍、爱奇艺等多个网站,超过8万个海量视频 2、聚合多个知名主播视频,包括马桶、陈子豪、橙子、籽岷、老村长等,主播视频每日更新 3、拥有最全的视频分类,包括单人模式、解说、跑酷、建筑、红石、多人、模组、解密、食物等 4、独家主播视频每日更新,超过几千名游戏高手为你录制视频,是拥有我的世界最多独家主播的平台 5、独家录制视频分享,边玩游戏还可以边做主播哦

我的世界的Mipmap级别是调什么的?

我的世界的Mipmap级别是调什么的?

我的世界的Mipmap级别是调什么的?

用来调纹理映射。 原理: MIPMAP方法相当于纹理LOD。当物体接近观察者的物体,使用高分辨率的MIPMAP图像:当物体逐渐远离观察者时,使用低分辨率的图像。 虽然内存消耗很大,但MIPMAP方法可以提高场景渲染质量。处理过程中,它将原始高分辨率纹理缩减为低分辨率的小纹理,缩减的方式是高度和宽度减半,并用减半后的值作为小纹理的尺度。 将低一级图像的每边的分辨率取为高一级图像的每边的分辨率的二分之一,而同一级分辨率的纹理组则由红、绿、蓝三个分量的纹理数组组成。由于这一个查找表包含了同一纹理区域在不同分辨率下的纹理颜色值,因此被称为Mipmap。 扩展资料 MIP map技术与材质贴图技术结合,根据距观看者远近距离的不同,以不同的分辨率将单一的材质贴图以多重图像的形式表现出来并代表平面纹理:尺寸最大的图像放在前面显著的位置,而相对较小的图像则后退到背景区域。 每一个不同的尺寸等级定义成一个MIP map水平。MIP map技术帮助避免了不想要的锯齿边缘(称为锯齿状图形)在图像中出现,这种锯齿状图形可能是由于在不同分辨率下使用bit map图像产生的。 纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。 参考资料来源:百度百科-Mipmap

求教opengl es2.0 中framebufferobject的一些生成机制

求教opengl es2.0 中framebufferobject的一些生成机制

帧缓冲区对象呢又称为FBO,它允许我们把渲染从窗口的帧缓冲区转移到我们所创建的一个或者多个离屏帧缓冲区。被推荐用于数据渲染到纹理对象,相对于其他同类技术,如数据拷贝或者交换缓冲区等等,使用FBO技术会更高效且易于实现。此buffer包含了color buffer,depth buffer,stencil buffer.渲染到纹理这个技术在游戏中经常用来模拟电视机或者监视器等等的效果。

1.FBO并不受窗口大小的限制。
2.纹理可以连接到FBO,允许直接渲染到纹理,不需要显示glCopyTexImage。
3.FBO可以包含许多颜色缓冲区,可以同时从一个片段着色器写入

FBO为OpenGL core API的一部分,使用它之前要检查GL_EXT_frmaebuffer_object扩展








FBO是一个图像容器,空的FBO容器里面存储的是texture(纹理)和renderbuffer(渲染缓冲区),纹理和渲染缓冲区都可以作为渲染的目标。一般使用的步骤:
设定好OpenGL基本环境 -> 建立FBO -> 启动FBO -> 对FBO绘图 -> 将FBO当成贴图 -> 启动原来的Frame Buffer -> 对Frame Buffer 画图 ->解除贴图的连接 -> 删除FBO

创建FBO:

生成一个对象,并取得一个有效的对象标识
GLuint fboname;
glGenFrameBuffersEXT(1,&fboname);

对FBO进行任何操作都需要首先绑定它:

把FBO与目标绑定,整型变量fboname用来保存FBO对象标识
glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,fboname);
要想关闭FBO,只要是fboname给0就可以:glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,0);即:除了创建新的FBO外,glBindFrameBufferEXT()也用于在FBO之间进行切换,绑定到名称0将会解除当前绑定的FBO,并把渲染重新定向到窗口的帧缓冲区。

加入一个深度缓存
一个FBO本身并没有多大用处,要想让他能被更有效的使用,我们需要把它与一些可被渲染的缓冲区绑定在一起,这样的缓冲区可以是纹理texture,也可以是渲染缓冲区renderbuffer,其实它就是一个用来支持离屏渲染的缓冲区,通常是帧缓冲区的一部分,一般不具有纹理格式,常见的模板缓冲和深度缓冲就是这样一类对象,我们要为FBO指定一个dephtbuffer:
GLuint dbname;
glGenRenderBuffersEXT(1,&dbname);

绑定该缓冲区,让它成为当前渲染缓冲:
glBindRenderBufferEXT(GL_RENDERBUFFER_EXT,dbname);

生成一个renderbuffer后,它本身并不会自动的分配内存空间,我们需要调用API来分配指定的内存空间:
glRenderBufferStorageEXT(GL_RENDERBUFFER_EXT,GL_DEPTH_COMPONENT,width,height);

这样就分配了一个w*h的深度缓冲区,这里使用了GL_DEPTH_COMPONENT,是指我们的空间用来保存深度值,除此之外还可以用来保存普通的GL_RGB/GL_RFBA格式的数据或者模板缓冲的信息。

接下来把这个深度缓存与准备好的FBO对象绑定在一起:
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT,dbname);

一个FBO可以有多个不同的绑定点,这里是绑定在FBO的深度缓冲绑定点上,如GL_COLOR_ATTACHMENTi_EXT,GL_DEPTH_ATTACHMENT_EXT等等

加入用于渲染的纹理:
到现在为止,还没有办法往FBO写入颜色信息,有两种方法实现:
把一个颜色渲染缓冲与FBO绑定或者把一个纹理与FBO绑定,要想把纹理与FBO绑定,我们首先要生成这个纹理:
GLuint img;
glGenTexture(1,&img);
glBindTexture(GL_TEXTURE_2D,img);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,wight,height,0,GL_RGBA,GL_UNSIGEND_BYTE,NULL);
生成一个普通的RGBA图像,大小是w*h, 与前面生成的渲染缓冲区的大小是一样,FBO中要求所绑定的对象有相同的高度与宽度,这时候没有数据
生成纹理之后,把这个纹理与FBO绑定在一起,以便把数据渲染到纹理空间中去
glFramebufferTexture2Dext(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENTO_EXT,GL_TEXTURE_2D,img,0);
参数GL_COLOR_ATTACHMENTO_EXT是告诉opengl把纹理对象绑定到FBO的0号绑定点,GL_TEXTURE_2D是纹理的格式,img是保存的纹理标识,指向之前就准备好的纹理对象,纹理可以使多重映射的图像,最后一个参数指定级为0,标识使用原图像
接下来测试FBO准备工作是否完,返回一个当前绑定FBO是否正确的状态信息,返回GL_FRAMEBUFFER_COMPLETE_EXT 就是指FBO准备好了 :
GLenum status=glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
渲染到纹理:
当我们要把数据渲染并输出到FBO时,我们就调用glBindFrameBufferEXT();当我们要停止输出FBO,把参数设置成0即可,当然,停止FBO输出很重要,我们完成FBO的工作就要停止FBO,让图像可以再屏幕上正确输出,
glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,fbname);
glPushAttrib(GL_VIEWPORT_BIT);
glViewPort(0,0,,wight,height);
//render as normal here
//output goes to the FBO and it's attached buffers
glPopAttrib();
glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,0);
面另外三行代码glPushAttrib/glPopAttrib 及 glViewport,是用来确保在你跳出FBO渲染的时候可以返回原正常的渲染路径。glViewport在这里的调用是十分必要的,我们不要常试把数据渲染到一个大于或小于FBO大小的区域。 函数glPushAtrrib 和 glPopAttrib 是用来快速保存视口信息。这一步也是必要的,因为FBO会共享主上下文的所有信息。任何的变动,都会同时影响到FBO及主上下文,当然也就会直接影响到你的正常屏幕渲染。
这里一个重要信息,你可能也注意到了,我们只是在绘制的时候绑定或解除FBO,但是我们没有重新绑定纹理或渲染缓冲区,这里因为在FBO中会一直保存了这种绑定关系,除非你要把它们分开或FBO对像被销毁了。

使用已渲染出来的纹理:

来到这里,我们已经把屏幕的数据渲染到了一个图像纹理上。现在我们来看一看如何来使用这张已经渲染好了的图像纹理。这个操作的本身其实是很简单的,我们只要把这张图像纹理当作普通纹理一样,绑定为当前纹理就可以了。
glBindTexture(GL_TEXTURE_2D, img);

以上这一函数调用完成之后,这张图像纹理就成了一个在绘图的时候用于被读取的普通纹理。
根据你在初始化时所指定的不同纹理滤波方式,你也许会希望为该纹理生成多重映像(mipmap)信息。如果要建立多重映像信息,多数的人都是在上传纹理数据的时候,通过调用函数gluBuild2DMipmaps()来实现,当然有些朋友可能会知道如何使用自动生成多重映像的扩展,但是在FBO扩展中,我们增加了第三种生成映像的方法,也就是使用GenerateMipmapEXT()函数。
这个函数的作用就是让OpenGL帮你自动创建多重映像信息。中间实现的过程,根据不同的显卡会有所不同,我们只关心它们最终的结果是一样就行了。值得注意的是:对于这种通过FBO渲染出来的纹理,要实现多重映像的话,只有这一种方法是正确的,这里你不可以使用自动生成函数来生成多重映像,这其中的原因有很多,如果你想深入了解的话,可以查看一下技术文档。
使用这一函数使方便,你所要做的就是先把该纹理对像绑定为当前纹理,然后调用一次该函数就可以了。
glGenerateMipmapEXT(GL_TEXTURE_2D);

OpenGL将会自动为我们生成所需要的全部信息,到现在我们的纹理便可以正常使用了。
一个重点要注意的地方:如果你打算使用多重映像(如 GL_LINEAR_MIPMAP_LINEAR),该函数glGenerateMipmapEXT()必须要在执行渲染到纹理之前调用。
在创建纹理的时候,我们可以按以下代码来做。
glGenTextures(1, &img);
glBindTexture(GL_TEXTURE_2D, img);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmapEXT(GL_TEXTURE_2D);

到现在,这张纹理和普通纹理没什么区别,我们就按处理普通纹理的方法来使用就可以了。

删除FBO:
glDeleteFrameBufferEXT(1,&fboname);

同样的,你如果分配了渲染缓冲对像,也别忘了要把它清理掉。本实例中我们分配的是深度缓存渲染对像,我们用以下函数来清除它:
glDeleteRenderbuffersEXT(1, &depthbuffer);


求教opengl es2.0 中framebufferobject的一些生成机制

求教opengl es2.0 中framebufferobject的一些生成机制

  OpenGL应用可以将图像显示输出重新定向到这个非屏幕显示用FrameBuffer对象中,类似于二维图形绘制中常用的Offscreen 技术。
  和缺省的屏幕显示FrameBuffer一样,由应用程序创建的FrameBuffer对象也是由Color Buffer, Depth Buffer和Stencil Buffer(可选)的集合组成。这些Buffer在FrameBuffer对象中可以称为FrameBuffer-attachable 图像,FrameBuffer定义了一些接入点(Attachment Point)可以用于连接(Attach)这些Buffer数组。
  OpenGL ES定义了两种FrameBuffer-attachable 图像,Texture 和 renderbuffer ,简单的可以将Texture 理解为Color buffer 或是2D图像,render buffer 对应于depth buffer。


求教opengl es2.0 中framebufferobject的一些生成机制

求教opengl es2.0 中framebufferobject的一些生成机制

帧缓冲区对象呢又称为FBO,它允许我们把渲染从窗口的帧缓冲区转移到我们所创建的一个或者多个离屏帧缓冲区。被推荐用于数据渲染到纹理对象,相对于其他同类技术,如数据拷贝或者交换缓冲区等等,使用FBO技术会更高效且易于实现。此buffer包含了color buffer,depth buffer,stencil buffer.渲染到纹理这个技术在游戏中经常用来模拟电视机或者监视器等等的效果。

1.FBO并不受窗口大小的限制。
2.纹理可以连接到FBO,允许直接渲染到纹理,不需要显示glCopyTexImage。
3.FBO可以包含许多颜色缓冲区,可以同时从一个片段着色器写入

FBO为OpenGL core API的一部分,使用它之前要检查GL_EXT_frmaebuffer_object扩展

FBO是一个图像容器,空的FBO容器里面存储的是texture(纹理)和renderbuffer(渲染缓冲区),纹理和渲染缓冲区都可以作为渲染的目标。一般使用的步骤:
设定好OpenGL基本环境 -> 建立FBO -> 启动FBO -> 对FBO绘图 -> 将FBO当成贴图 -> 启动原来的Frame Buffer -> 对Frame Buffer 画图 ->解除贴图的连接 -> 删除FBO

创建FBO:

生成一个对象,并取得一个有效的对象标识
GLuint fboname;
glGenFrameBuffersEXT(1,&fboname);

对FBO进行任何操作都需要首先绑定它:

把FBO与目标绑定,整型变量fboname用来保存FBO对象标识
glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,fboname);
要想关闭FBO,只要是fboname给0就可以:glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,0);即:除了创建新的FBO外,glBindFrameBufferEXT()也用于在FBO之间进行切换,绑定到名称0将会解除当前绑定的FBO,并把渲染重新定向到窗口的帧缓冲区。

加入一个深度缓存
一个FBO本身并没有多大用处,要想让他能被更有效的使用,我们需要把它与一些可被渲染的缓冲区绑定在一起,这样的缓冲区可以是纹理texture,也可以是渲染缓冲区renderbuffer,其实它就是一个用来支持离屏渲染的缓冲区,通常是帧缓冲区的一部分,一般不具有纹理格式,常见的模板缓冲和深度缓冲就是这样一类对象,我们要为FBO指定一个dephtbuffer:
GLuint dbname;
glGenRenderBuffersEXT(1,&dbname);

绑定该缓冲区,让它成为当前渲染缓冲:
glBindRenderBufferEXT(GL_RENDERBUFFER_EXT,dbname);

生成一个renderbuffer后,它本身并不会自动的分配内存空间,我们需要调用API来分配指定的内存空间:
glRenderBufferStorageEXT(GL_RENDERBUFFER_EXT,GL_DEPTH_COMPONENT,width,height);

这样就分配了一个w*h的深度缓冲区,这里使用了GL_DEPTH_COMPONENT,是指我们的空间用来保存深度值,除此之外还可以用来保存普通的GL_RGB/GL_RFBA格式的数据或者模板缓冲的信息。

接下来把这个深度缓存与准备好的FBO对象绑定在一起:
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT,dbname);

一个FBO可以有多个不同的绑定点,这里是绑定在FBO的深度缓冲绑定点上,如GL_COLOR_ATTACHMENTi_EXT,GL_DEPTH_ATTACHMENT_EXT等等

加入用于渲染的纹理:
到现在为止,还没有办法往FBO写入颜色信息,有两种方法实现:
把一个颜色渲染缓冲与FBO绑定或者把一个纹理与FBO绑定,要想把纹理与FBO绑定,我们首先要生成这个纹理:
GLuint img;
glGenTexture(1,&img);
glBindTexture(GL_TEXTURE_2D,img);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,wight,height,0,GL_RGBA,GL_UNSIGEND_BYTE,NULL);
生成一个普通的RGBA图像,大小是w*h, 与前面生成的渲染缓冲区的大小是一样,FBO中要求所绑定的对象有相同的高度与宽度,这时候没有数据
生成纹理之后,把这个纹理与FBO绑定在一起,以便把数据渲染到纹理空间中去
glFramebufferTexture2Dext(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENTO_EXT,GL_TEXTURE_2D,img,0);
参数GL_COLOR_ATTACHMENTO_EXT是告诉opengl把纹理对象绑定到FBO的0号绑定点,GL_TEXTURE_2D是纹理的格式,img是保存的纹理标识,指向之前就准备好的纹理对象,纹理可以使多重映射的图像,最后一个参数指定级为0,标识使用原图像
接下来测试FBO准备工作是否完,返回一个当前绑定FBO是否正确的状态信息,返回GL_FRAMEBUFFER_COMPLETE_EXT 就是指FBO准备好了 :
GLenum status=glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
渲染到纹理:
当我们要把数据渲染并输出到FBO时,我们就调用glBindFrameBufferEXT();当我们要停止输出FBO,把参数设置成0即可,当然,停止FBO输出很重要,我们完成FBO的工作就要停止FBO,让图像可以再屏幕上正确输出,
glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,fbname);
glPushAttrib(GL_VIEWPORT_BIT);
glViewPort(0,0,,wight,height);
//render as normal here
//output goes to the FBO and it's attached buffers
glPopAttrib();
glBindFrameBufferEXT(GL_FRAMEBUFFER_EXT,0);
面另外三行代码glPushAttrib/glPopAttrib 及 glViewport,是用来确保在你跳出FBO渲染的时候可以返回原正常的渲染路径。glViewport在这里的调用是十分必要的,我们不要常试把数据渲染到一个大于或小于FBO大小的区域。 函数glPushAtrrib 和 glPopAttrib 是用来快速保存视口信息。这一步也是必要的,因为FBO会共享主上下文的所有信息。任何的变动,都会同时影响到FBO及主上下文,当然也就会直接影响到你的正常屏幕渲染。
这里一个重要信息,你可能也注意到了,我们只是在绘制的时候绑定或解除FBO,但是我们没有重新绑定纹理或渲染缓冲区,这里因为在FBO中会一直保存了这种绑定关系,除非你要把它们分开或FBO对像被销毁了。

使用已渲染出来的纹理:

来到这里,我们已经把屏幕的数据渲染到了一个图像纹理上。现在我们来看一看如何来使用这张已经渲染好了的图像纹理。这个操作的本身其实是很简单的,我们只要把这张图像纹理当作普通纹理一样,绑定为当前纹理就可以了。
glBindTexture(GL_TEXTURE_2D, img);

以上这一函数调用完成之后,这张图像纹理就成了一个在绘图的时候用于被读取的普通纹理。
根据你在初始化时所指定的不同纹理滤波方式,你也许会希望为该纹理生成多重映像(mipmap)信息。如果要建立多重映像信息,多数的人都是在上传纹理数据的时候,通过调用函数gluBuild2DMipmaps()来实现,当然有些朋友可能会知道如何使用自动生成多重映像的扩展,但是在FBO扩展中,我们增加了第三种生成映像的方法,也就是使用GenerateMipmapEXT()函数。
这个函数的作用就是让OpenGL帮你自动创建多重映像信息。中间实现的过程,根据不同的显卡会有所不同,我们只关心它们最终的结果是一样就行了。值得注意的是:对于这种通过FBO渲染出来的纹理,要实现多重映像的话,只有这一种方法是正确的,这里你不可以使用自动生成函数来生成多重映像,这其中的原因有很多,如果你想深入了解的话,可以查看一下技术文档。
使用这一函数使方便,你所要做的就是先把该纹理对像绑定为当前纹理,然后调用一次该函数就可以了。
glGenerateMipmapEXT(GL_TEXTURE_2D);

OpenGL将会自动为我们生成所需要的全部信息,到现在我们的纹理便可以正常使用了。
一个重点要注意的地方:如果你打算使用多重映像(如 GL_LINEAR_MIPMAP_LINEAR),该函数glGenerateMipmapEXT()必须要在执行渲染到纹理之前调用。
在创建纹理的时候,我们可以按以下代码来做。
glGenTextures(1, &img);
glBindTexture(GL_TEXTURE_2D, img);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmapEXT(GL_TEXTURE_2D);

到现在,这张纹理和普通纹理没什么区别,我们就按处理普通纹理的方法来使用就可以了。

删除FBO:
glDeleteFrameBufferEXT(1,&fboname);

同样的,你如果分配了渲染缓冲对像,也别忘了要把它清理掉。本实例中我们分配的是深度缓存渲染对像,我们用以下函数来清除它:
glDeleteRenderbuffersEXT(1, &depthbuffer);


如何在Android上使用OpenGL ES 2.0绘制点

如何在Android上使用OpenGL ES 2.0绘制点

FrameBuffer对象的概念可以参见前面文章AndroidOpenGLES开发教程(23):FrameBuffer。简单的和2D图像类比,FrameBuffer如果对应到二维图形环境中,就是一个2D的内存数组空间,缺省情况为屏幕的显存,也可以创建Offscreen内存空间,此时FrameBuffer可以是一个二维数组,数组每个元素代表一个像素颜色。对于三维图形来说,除了需要代表颜色的二维数组(ColorBuffer),还需要深度二维数组(DepthBuffer)或遮罩数组(StencilBuffer),因此在OpenGL中的FrameBuffer为上述ColorBuffer,DepthBuffer,StencilBuffer的集合。如果手机具有GPU,其缺省的FrameBuffer也是3D屏幕显示区域。通过OpenglES扩展支持,应用程序也可以创建内存中的FrameBuffer对象(不用于屏幕显示)。通过这种应用程序创建的FrameBuffer对象,OpenGL应用可以将图像显示输出重新定向到这个非屏幕显示用FrameBuffer对象中,类似于二维图形绘制中常用的Offscreen技术。和缺省的屏幕显示FrameBuffer一样,由应用程序创建的FrameBuffer对象也是由ColorBuffer,DepthBuffer和StencilBuffer(可选)的集合组成。这些Buffer在FrameBuffer对象中可以称为FrameBuffer-attachable图像,FrameBuffer定义了一些接入点(AttachmentPoint)可以用于连接(Attach)这些Buffer数组。OpenGLES定义了两种FrameBuffer-attachable图像,Texture和renderbuffer,简单的可以将Texture理解为Colorbuffer或是2D图像,renderbuffer对应于depthbuffer。


如何设置DISPLAY变量,正确运行Oracle程序?

如何设置DISPLAY变量,正确运行Oracle程序?

设置DISPLAY变量,正确运行Oracle程序具体如下: root登录一个窗口,运行一下语句。 #export DISPLAY=:0.0 #xhost + #su - oracle 然后就在这个窗口运行oracle的安装程序。 不过你要在安装linux的时候装了图形界面,而且现在安装也是在图形界面才行。 DISPLAY用来设置将图形显示到何处,直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0,,此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上,,在终端上输入printenv查看当前环境变量, 输出结果中有如下内容: DISPLAY=:0.0 使用xdpyinfo可以查看到当前显示的更具体的信息。 DISPLAY环境变量格式如下host:NumA.NumB, host指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器。

怎样设置ubuntu12.04的启动管理器,跳过或是隐藏选系统界面,不用等待,不用选,直接进入ubuntu

如何SSH远程连接虚拟机中的Ubuntu

虚拟机中设置网络连接模式为桥接模式,Ubuntu中手动设置网络参数,将Ubuntu的IP设置成与windows同一网段,并且确保能互相ping通。安装SSH-server终端下输入命令: sudo apt-get install openssh-server启动SSH-serversudo /etc/init.d/ssh startwindows下使用软件PuTTy,填入刚刚设置好的Ubuntu的IP,直接连接,接下来就尽情的玩吧(当然,虚拟机得先打开)。相关阅读:Windows下操纵Linux的利器putty-x86(附下载)P.S. 关于Connection refused错误如果出现以下错误,则很可能是因为还没有安装ssh-server:ssh: connect to host localhost port 22: Connection refused


Ubuntu下如何通过SSH远程登录服务器

1. 首先在服务器上安装ssh 的服务器端。 $ sudo aptitude install openssh-server 2. 启动ssh-server。 $ /etc/init.d/ssh restart 3. 确认ssh-server 已经正常工作。 $ netstat -tlp tcp6 0 0 *:ssh *:* LISTEN - 看到上面这一行输出说明ssh-server 已经在运行了。 4. 在Ubuntu 客户端通过ssh 登录服务器。假设服务器的IP 地址是192.168.0.103,登录的 用户名是hyx。 接下来会提示输入密码,然后就能成功登录到服务器上了。


ubuntu16.04怎么关掉图形界面启动

第一步,具体命令及操作如下:
leekwen@kwen:~$ sudo vi /etc/init/rc-sysinit.conf

env DEFAULT_RUNLEVEL=3 <------将原来的env DEFAULT_RUNLEVEL=2修改为env DEFAULT_RUNLEVEL=3
第二步,具体命令及操作如下:
leekwen@kwen:~$ sudo vi /etc/init/gdm.conf
start on runlevel [245] <------增加此行
stop on runlevel [0136] <-----将原来的stop on runlevel [016]修改为stop on runlevel [0136]
第三步,具体命令及操作如下:
leekwen@kwen:~$ sudo reboot <-----------重新启动即可
如果在本地机器上进入后,想切换到图形界面,可直接输入startx即可。


ubuntu16.04怎样才能让桌面显示出来?

ubuntu16.04怎样才能让桌面显示出来?

ubuntu16.04让桌面显示出来的步骤: 1、在 Ubuntu 16.04 中,同时按下:Ctrl + Win + d ,桌面显示一组专用的键盘快捷键,再按下,桌面一片空白;再按一次,桌面恢复原状。 2、按下Win + s,屏幕将同时显示所有工作区;可以通过鼠标或键盘方向键,在不同工作区之间切换。开启工作区在“系统设置”——“个人”——“外观”——“行为”中,有切换按钮。 3、在“开启工作区”右侧,还有添加“显示桌面”图标到启动器按钮,开启这个按钮,屏幕左侧启动器栏上将多出一个对应的按钮,点击此按钮一次显示桌面,再点一次恢复桌面。

ubuntu中怎么修改ssh配置文件

SH-Server配置指南
一、SSH简介
SSH (Secure Shell)是一个应用程序中提供安全通信的协议,通过SSH协议可以安全地访问服务器,因为SSH 具有成熟的公钥加密体系,在数据进行传输时进行加密,保证数据在传输时不被恶意篡改、破坏和泄露,能有效防止网络嗅探和IP欺骗等攻击。
二、服务器端Ubuntu平台下OpenSSH server的安装
SSH是由芬兰的一家公司开发的,但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软件,而且是免费的。
下以命令均是以管理员身份登录使用
1. 在Ubuntu终端使用apt命令


复制代码
代码如下:

# apt-get install openssh-server


如果下载失败,可能是由于系统需要更新的缘故,尝试更新一下,就可以了。使用一下命令:


复制代码
代码如下:

# apt-get update


2. 配置openssh server,可以按照需求修改配置文件


复制代码
代码如下:

# vi etc/ssh/ssh_config


3. 重启服务器


复制代码
代码如下:

# /etc/init.d/ssh restart


以上OpenSSH server就算安装完成。


配置“/etc/ssh/ssh_config”文件
“/etc/ssh/ssh_config” 文件是OpenSSH系统范围的配置文件,允许你通过设置不同的选项来改变客户端程序的运行方式。这个文件的每一行
包含“关键词-值”的匹配,其中“关键词”是忽略大小写的。下面列出来的是最重要的关键词,用man命令查看帮助页(ssh (1))可以得到
详细的列表。
编辑“ssh_config”文件(vi /etc/ssh/ssh_config),添加或改变下面的参数:


复制代码
代码如下:

# Site-wide defaults for various options
Host *
ForwardAgent no
ForwardX11 no
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
FallBackToRsh no
UseRsh no
BatchMode no
CheckHostIP yes
StrictHostKeyChecking no
IdentityFile ~/.ssh/identity
Port 22
Cipher blowfish
EscapeChar ~


下面逐行说明上面的选项设置:

Host *
选项“Host”只对能够匹配后面字串的计算机有效。“*”表示所有的计算机。
ForwardAgent no
“ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。
ForwardX11 no
“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。
RhostsAuthentication no
“RhostsAuthentication”设置是否使用基于rhosts的安全验证。
RhostsRSAAuthentication no
“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。
RSAAuthentication yes
“RSAAuthentication”设置是否使用RSA算法进行安全验证。
PasswordAuthentication yes
“PasswordAuthentication”设置是否使用口令验证。
FallBackToRsh no
“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。
UseRsh no
“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。
BatchMode no
“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本
文件和批处理任务十分有用。
CheckHostIP yes
“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”。
StrictHostKeyChecking no
“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密
匙发生了变化,就拒绝连接。
IdentityFile ~/.ssh/identity
“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。
Port 22
“Port”设置连接到远程主机的端口。
Cipher blowfish
“Cipher”设置加密用的密码。
EscapeChar ~
“EscapeChar”设置escape字符。
配置“/etc/ssh/sshd_config”文件
“/etc/ssh/sshd_config”是OpenSSH的配置文件,允许设置选项改变这个daemon的运行。这个文件的每一行包含“关键词-值”的匹配,其中
“关键词”是忽略大小写的。下面列出来的是最重要的关键词,用man命令查看帮助页(sshd (8))可以得到详细的列表。
编辑“sshd_config”文件(vi /etc/ssh/sshd_config),加入或改变下面的参数:


复制代码
代码如下:

# This is ssh server systemwide configuration file.
Port 22
ListenAddress 192.168.1.1
HostKey /etc/ssh/ssh_host_key
ServerKeyBits 1024
LoginGraceTime 600
KeyRegenerationInterval 3600
PermitRootLogin no
IgnoreRhosts yes
IgnoreUserKnownHosts yes
StrictModes yes
X11Forwarding no
PrintMotd yes
SyslogFacility AUTH
LogLevel INFO
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
AllowUsers admin


下面逐行说明上面的选项设置:
Port 22
“Port”设置sshd监听的端口号。
ListenAddress 192.168.1.1
“ListenAddress”设置sshd服务器绑定的IP地址。
HostKey /etc/ssh/ssh_host_key
“HostKey”设置包含计算机私人密匙的文件。
ServerKeyBits 1024
“ServerKeyBits”定义服务器密匙的位数。
LoginGraceTime 600
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
KeyRegenerationInterval 3600
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被
截获的信息。
PermitRootLogin no
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。
IgnoreRhosts yes
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。
IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts”
StrictModes yes
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的
目录和文件设成任何人都有写权限。
X11Forwarding no
“X11Forwarding”设置是否允许X11转发。
PrintMotd yes
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
SyslogFacility AUTH
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。
LogLevel INFO
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
RhostsAuthentication no
“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。
RhostsRSAAuthentication no
“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。
RSAAuthentication yes
“RSAAuthentication”设置是否允许只有RSA安全验证。
PasswordAuthentication yes
“PasswordAuthentication”设置是否允许口令验证。
PermitEmptyPasswords no
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。
AllowUsers admin
“AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串用空格隔开。主机名可以是
DNS名或IP地址。
使用SFTP代替FTP传输文件
FTP(文件传输协议)是一种使用非常广泛的在网络中传输文件的方式,但是,它也同样存在被网络窃听的危险,因为它也是以明文传送用户认证信息。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure FTP)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。若要开启 SFTP功能可以修改sshd2_config文件的下列内容:

复制代码
代码如下:

# subsystem-sftp sftp-server


去掉行首的“#”,然后重新启动SSH服务器,这样在进行SSH连接时就可以同时使用SFTP传输文件。
关于客户端设置
以上是对服务器的设置,其实在SSH服务器中已经包含了一些客户端工具(如SSH,SFTP工具)。但是,更多的客户端用户使用Windows系统,下
面就对Windows上的客户端系统设置加以说明。
首先从上文给出的网址下载“SSHSecureShellClient-3.2.3.exe”文件并安装。安装完成后,在桌面上会产成两个快捷方式,一个是“SSH
Secure Shell Client”,用于远程管理,另一个是“SSH Secure File Transfer Client”,用于和服务器进行文件传输。在工具栏中点击
“quick connnect”,输入正确的主机名和用户名,然后在弹出的对话框中输入密码完成登录,即可开始执行命令或者传输文件。在使用SFTP
时,默认只能显示用户的宿主目录的内容和非隐藏文件。但是,有时候您可能还要查看其它目录或者隐藏文件,这时只需要在菜单“eidt-
>setting-> file transfer”的选项中选中“show root directory”和“show hidden file”两个选项即可。
使普通用户仅使用SFTP而没有使用Shell的权限
默认情况下管理员给系统添加的账号将同时具有SFTP和SSH的权限。让普通用户使用shell执行命令也是有很大的安全隐患的,如果能够禁止用
户使用shell执行命令而仅使用SFTP传输文件,就能消除这种安全隐患,完全实现FTP的功能,
正如上文所述,SFTP没有单独的守护进程,只能借助于sshd守护进程,所以我们仍然需要使用SSH服务器,要保证sshd守护进程处于运行状态。
具体实现方法如下:
首先,在编译安装时,编译中一定要有“–enable-static” 选项。安装成功后,在安装目录下的bin目录中执行下面的命令:


复制代码
代码如下:

[root@localhost bin]# ls -l ssh-dummy-shell* sftp-server2*


将看到下列输出内容:


复制代码
代码如下:

-rwxr-xr-x 1 root root 1350417 Apr 28 16:30 sftp-server2
-rwxr-xr-x 1 root root 3566890 Apr 28 16:30 sftp-server2.static
-rwxr-xr-x 1 root root 72388 Apr 28 16:30 ssh-dummy-shell
-rwxr-xr-x 1 root root 1813412 Apr 28 16:30 ssh-dummy-shell.static


其中带“static”后缀名,且比较大的两个文件就是加上“–enable-static”选项后生成的,后面我们将用到这里两个文件。
下面以添加普通账号test为例讲述具体操作步骤。
1.在“/home”目录(或者将要存放普通用户宿主目录的目录)下创建“bin”子目录,并将两个static文件复制到此目录下(复制后改名去掉static后缀),执行如下命令:


复制代码
代码如下:

[root@localhost bin]# cd /usr/local/ssh3.2/bin
[root@localhost bin]#cp ssh-dummy-shell.static /home/bin/ssh-dummy-shell
[root@localhost bin]# cp sftp-server2.static /home/bin/sftp-server
[root@localhost bin]#chown -R root.root /home/bin
[root@localhost bin]#chmod -R 755 /home/bin


2.添加一个组,使以后所有禁止使用shell的用户都属于这个组,这样便于管理更多的用户:
[root@localhost bin]#groupadd template
3.在添加系统账号时使用如下命令:


复制代码
代码如下:

[root@localhost root]#useradd -s /bin/ssh-dummy-shell -g template test
[root@localhost root]#passwd test
[root@localhost root]#mkdir /home/test/bin
[root@localhost root]#cd /home/test/bin
[root@localhost bin]#ln /home/bin/ssh-dummy-shell ssh-dummy-shell
[root@localhost bin]#ln /home/bin/sftp-server sftp-server
[root@localhost bin]#chown -R root.root /home/test/bin
[root@localhost bin]#chmod -R 755 /home/test/bin


3.用户添加成功后,还需要修改/etc/ssh2/sshd2_config文件,将下列内容:
#ChRootGroups sftp,guest
改为:
ChRootGroups sftp,guest,template
修改上面这行内容,主要是为了禁止普通用户查看系统的其它目录,把其权限限制在自己的主目录下。重新启动SSH服务器程序,在客户端使用SSH Secure File Transfer Client登录,即使选择显示根目录,普通用户也看不到其它的任何目录,而是把自己的主目录当作根目录。注意,这里使用的是按用户所属组限制,这样可以使包含在template组内的所有用户都可以实现此功能。若您只要限制个别用户的话,可以修改下面的内容:


复制代码
代码如下:

#ChRootUsers anonymous,ftp,guest


ubuntu 不能进入grub引导

按F5跳过检索,建议体检电脑 这个是硬盘读取问题,正常的,有时候电脑硬盘会出现 今天我也遇到这个问题了,亲测下面方法能修复 下个mbrfix winpe启动,cmd打开,找到mbrfix 运行 mbrfix /drive 0 fixmbr 如果不行的话,就做一个U盘启动盘选择U盘启动 1.通过U盘启动/光盘启动,来修复主引导来解决 2.通过U盘启动/光盘启动,重新做一个系统 3.开机按F5键,进入修复主引导的菜单。 然后选择激活系统就可以了。


怎样设置ubuntu12.04的启动管理器,跳过或是隐藏选系统界面,不用等待,不用选,直接进入ubuntu

把/boot/grub/grub.cfg贴出来看看——看看哪些参数是自己定制的。
直接修改这个文件也可以达到你要的目的,但是更新或者安装某些软件会修改该文件:
timeout=0
default=0
修改/etc/grub/default(应该是这个文件)里面的值,这样就不会受更新和安装软件的影响,但是需要执行update-grub来更新。