unity glbindtextureframebuffer 要包含什么库

【风宇冲】图形化调试
原创文章如需转载请注明:转载自
&&&&&&&&&&&&&&&&&&&&&&&
图形化调试&
图形化调试可以加速开发。
例如在战斗中,可能需要知道所有单位的仇恨值,如果这些信息全打log的话,很难有直观感受,
而如果在Scene窗口里,单位头顶有一个球,越红表示仇恨越高,越暗表示仇恨越低,那么调试起来比打log直观多了。
图形化调试】
Unity中图形化调试主要4种
Debug.Draw
Gizmos.Draw
Graphic.DrawMesh
只需在Scene窗口显示的调试图像
一直显示的 OnDrawGizmos +
Gizmos.Draw
选中显示的 OnDrawGizmosSelected +
Gizmos.Draw
脚本控制的 Update + Debug.Draw
需要在实际设备屏幕显示的调试图像
Update+Graphic.DrawMesh
OnRenderObject+GL
Graphic.DrawMesh和Debug.Draw&&
调用一致,都是在Update系里
Graphic.DrawMesh和GL&&&&&&
显示类似,都在各个窗口显示,并且可以设置材质。
四种方式比较
(1)Debug.Draw
=1=一般在Update/Fixed Update/LateUpdate里调用
=2=只在Scene窗口里显示
=3=并且不能设置材质
void&Update()
&&&&&&&&Debug.DrawLine&(worldPos1,&worldPos2,Color.yellow);
(2)Gizmos.Draw
=1=在OnDrawGizmos /OnDrawGizmosSelected里调用
=2=只在Scene窗口里显示
=3=并且不能设置材质
&&&&public&void&OnDrawGizmosSelected()&{
&&&&&&&&Gizmos.DrawLine(Vector3.zero,&new&Vector3(0,3f,0));
(3)Graphic.DrawMesh
=1=一般在Update/Fixed Update/LateUpdate里调用
=2=实际屏幕和Scene窗口都能显示
=3=可以设置材质
void&Update()
&&&&&&&&&&&&Graphics.DrawMesh(mesh,&worldPos,&worldRotation,&material,&0);
=1=一般在物体的OnRenderObject 或者相机的OnPostRender里调用
=2=实际屏幕和Scene窗口都能显示
=3=可以设置材质
一个GL.Begin/GL.End里的渲染是自动合并的,一般是一个Drawcall
画一些线,三角可以。用GL.TRIANGLES
显示整个Mesh的话会超卡。
例:渲染线框
void&OnRenderObject()
&&&&&&&&mat.SetPass(0);
GL.wireframe&=&true;
& GL.Color&(new&Color&(1,1,&0,&0.8F));
&&&&&&&&GL.PushMatrix();
&&&&&&&&GL.Begin(GL.TRIANGLES);
&&&&&&&&for(int&i=0;i&&/span&mesh.triangles.Length-2;i+=3)
&&&&&&&&&&&&GL.Vertex(mesh.vertices[mesh.triangles[i]]);
&&&&&&&&&&&&GL.Vertex(mesh.vertices[mesh.triangles[i+1]]);
&&&&&&&&&&&&GL.Vertex(mesh.vertices[mesh.triangles[i+2]]);
&&&&&&&&GL.End();
&&&&&&&&GL.PopMatrix();
&&&&&&&&&&&&&
GL.wireframe&=&false;
GL除了可以用来调试,可以拿来做功能,例如LineRenderer,地格等。
GL即Graphics Library。Low-Level Graphics
Library。计算matrices,发出类似OpenGL的immediate模式的渲染指令,和其他低级图像任务。Graphic.DrawMesh()比GL更高效。
GL立即绘制函数只用当前material的设置。因此除非你显示指定mat,否则mat可以是任何材质。并且GL可能会改变材质。
GL是立即执行的,如果你在Update()里调用,它们将在相机渲染前执行,相机渲染将会清空屏幕,GL效果将无法看到。
通常GL用法是
在camera上贴脚本,并在OnPostRender()里执行。
也可以挂在任何GameObject上,在OnRenderObject()里执行。
或者挂在物体上
1.GL的线等基本图元并没有uv.
所有是没有贴图纹理影射的,shader里仅仅做的是单色计算或者对之前的影像加以处理。
2.GL所使用的shader里必须有Cull off指令,否则显示会变成如下
3. 如果是线,颜色是GL.Color( new
Color(1,1,1,0.5f)
);设置的颜色
&如果是GL.TRIANGLES或者是GL.QUADS,则颜色是shader里的颜色。
GL.PushMatrix()
保存matrices至matrix stack上。
GL.PopMatrix()
从matrix stack上读取matrices。
GL.LoadPixelMatrix()
改变MVP矩阵,使得transform里的xy
直接对应像素,(0,0)表示屏幕viewport的左下角,z的范围是(-1,1),该函数改变camera的参数,所以需要GL.PushMatrix()保存和GL.PopMatrix()读取。
GL.Vertex3()的取值范围从左下角的(0,0,0)
至右上角的(Screen.width,Screen.height,0)
GL.LoadOrtho()
设置ortho perspective,即水平视角。After calling LoadOrtho, the viewing
frustum goes from (0,0,-1) to (1,1,100). 主要用于在纯2D里绘制图元。
GL.Vertex3()的取值范围从左下角的(0,0,0)
至右上角的(1,1,0)
OnPostRender()
只有物体上有激活的摄像机时,才会调用的函数,当摄像机完成渲染场景,绘制了所有物体以后调用。
OnPostRender可以变成co-routine,加yield语句即可。
WaitForEndOfFrame()
等待至 所有绘制之后,end of frame,
就在展示frame到屏幕之前。可以做截图。可以在任何物体上使用该函数。
例1:屏幕画线
using UnityE
using System.C
public class GLTest : MonoBehaviour
OnPostRender() {
&&if (!mat) {
&&Debug.LogError("Please
Assign a material on the inspector");
&&GL.PushMatrix();
//保存当前Matirx
&&mat.SetPass(0);
//刷新当前材质
&&GL.LoadPixelMatrix();//设置pixelMatrix
&&GL.Color(Color.yellow);
&&GL.Begin(GL.LINES);
&&GL.Vertex3(0,
&&GL.Vertex3(Screen.width,
Screen.height, 0);
&&GL.End();
&&GL.PopMatrix();//读取之前的Matrix
using System.IO;
using UnityE
using System.C
public class ScreenShot : MonoBehaviour
&&void Start()
&&StartCoroutine(UploadPNG()
&&IEnumerator UploadPNG() {
&&yield return new
WaitForEndOfFrame();
print ("yuuuuu");
&&int width =
&&int height =
&&Texture2D tex =
new Texture2D(width, height,
TextureFormat.RGB24, false);
&&tex.ReadPixels(new
Rect(0, 0, width, height),
&&tex.Apply();
&&byte[] bytes =
tex.EncodeToPNG();
File.WriteAllBytes(Application.dataPath+"/ss.png",bytes);
UnityEditor.AssetDatabase.Refresh();
例3:展示Alpha
using UnityE
using System.C
public class GLTest : MonoBehaviour
public Shader
public Texture2D t2d;
void Start()
mat = new Material(shader);
mat.mainTexture = t2d;
OnPostRender() {
&&if (!mat) {
&&Debug.LogError("Please
Assign a material on the inspector");
&&GL.PushMatrix();
&&mat.SetPass(0);
& GL.LoadOrtho();
& GL.Begin(GL.QUADS);
&&GL.Vertex3(0,
&&GL.Vertex3(1f,
&&GL.Vertex3(1f,
&&GL.Vertex3(0,
&&GL.End();
&&GL.PopMatrix();
Shader "Custom/GLDrawLine" {
Properties {
_MainTex ("Base (RGB)", 2D) =
"white" {}
SubShader {
Blend DstAlpha zero
Color(1,1,1,1)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。推荐这篇日记的豆列
&&&&&&&&&&&&glBindFramebuffer() 离屏渲染+双缓存+读取opengl像素 glReadPixels()
时间: 03:38:03
&&&& 阅读:109
&&&& 评论:
&&&& 收藏:0
标签:Opengl4.0中可以进行离屏渲染,即创造一个帧缓存对象(FBO),绑定一个帧缓存对象后,所有对Op--engl的操作都会针对这个帧缓存对象执行。而最近做项目时,在做一个拍照功能——读取Opengl渲染出的像素,并存入到BMP位图中。项目采用的是Opengl1.0和Opengl4.3结合的方法,并且两者的使用相对独立。使用旧的Opengl方法运行程序时,通过
glReadBuffer(GL_FRONT);//指定要读取的缓存
glReadPixels(0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (unsigned char*)imageData);
即可读取到像素,并保存起来。
但是,一旦使用Opengl4.3进行离屏渲染后,发现glReadBuffer()和glReadPixels()不能再读取到像素,于是我对每一部分使用Opengl4.3的代码都做了glGetError()检测,发现使用Opengl4.3的代码部分并没有调用错误,所以就一直查不出来问题在哪里。最后我想会不会是Opengl绑定的问题,终于发现Opengl4.3使用离屏渲染后没有解绑帧缓存,即:
glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE);
于是我去查了www.khronos.org/关于glBindFramebuffer的定义:
While a non-zero framebuffer object name is bound, all rendering to the framebuffer (with&&and&) and&reading from the framebuffer (with&,&, or&) use the images attached to the&application-created framebuffer object rather than the default window-system-provided framebuffer.
Application created framebuffer objects (i.e. those with a non-zero name) differ from the default window-system-provided framebufferin a few important ways. First, they have modifiable attachment points for a color buffer, a depth buffer, and a stencil buffer to which&framebuffer attachable images may be attached and detached. Second, the size and format of the attached images are controlled entirely within the GL and are not affected by window-system events, such as pixel format selection, window resizes, and display mode&changes. Third, when rendering to or reading from an application created framebuffer object, the pixel ownership test always succeeds&(i.e. they own all their pixels).Fourth, there are no visible color buffer bitplanes, only a single &off-screen& color image attachment, so&there is no sense of front and back buffers or swapping. Finally, there is no multisample buffer, so the value of the implementation-dependent state variables&GL_SAMPLES&and&GL_SAMPLE_BUFFERS&are both zero for application created framebuffer objects.
也就是说,使用glBindFramebuffer()进行离屏渲染时,Opengl的渲染和读取都是通过attached的纹理对帧缓存进行操作的,不再是对windows系统提供的默认帧缓存进行操作,所以我们见到的屏幕上显示出来的图像并不是一个可见的颜色缓存位面(visible color buffer bitplane),只不过是一个“离屏”的颜色纹理(&off-screen&&color image attachment),所以双缓存就不起作用了(即使调用swapbuffer(),像素也不会被渲染到前后缓存中),所以glReadBuffer(GL_FRONT);也就读取不出像素出来。
这个Bug前后找了将近两个星期,在这里Mark一下,说白了还是对Opengl理解不够,Opengl的使用个人感觉比较晦涩,还需要好好研究。希望对大家有所帮助。
格式一直调不好。。好吧。。标签:
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!/init/archive//165778.aspx
帧缓冲区对象呢又称为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
&&&&& 生成一个对象,并取得一个有效的对象标识
&&&&&& &GL
&&&&& & 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:
&&&&&& 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绑定,我们首先要生成这个纹理:
&&&&&&& GL
&&&&&&& 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);
到现在,这张纹理和普通纹理没什么区别,我们就按处理普通纹理的方法来使用就可以了。
glDeleteFrameBufferEXT(1,&fboname);
同样的,你如果分配了渲染缓冲对像,也别忘了要把它清理掉。本实例中我们分配的是深度缓存渲染对像,我们用以下函数来清除它:
glDeleteRenderbuffersEXT(1, &depthbuffer);
FBO的完整性在向FBO输出渲染结果之前,需要测试FBO的完整性。如果FBO不完整,任何渲染操作都会失败。我们可以使用glCheckFramebufferStatusEXT()函数来测试FBO的完整性(此函数不能在glBegin()和glEnd()函数之间调用)。FBO完整性的判别法则如下:与FBO挂接的二维数组对象的长度和宽度必须不能为。如果一个二维数组对象被挂接到FBO的颜色缓冲区挂接点时,二维数组必须具有内部颜色格式(GL_RGBA, GL_DEPTH_COMPONENT, GL_LUMINANCE等)。如果一个二维数组对象被挂接到FBO的深度缓冲区挂接点时,二维数组必须具有内部深度格式(GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT24_EXT等)。如果一个二维数组对象被挂接到FBO的模板缓冲区挂接点时,二维数组必须具有内部模板格式(GL_STENCIL_INDEX, GL_STENCIL_INDEX8_EXT等)。FBO至少挂接有一个二维数组缓冲区对象。同一个FBO上挂接的二维数组对象必须拥有相同的长度和宽度。所有的颜色缓冲区挂接点上挂接的二维数组对象必须具有相同的内部格式。 头文件:
1#include&&gl\glew.h&&&2#include&&gl\glut.h&3#include&&gl\glext.h&
初始化FBO:
&1void&InitFBO(){
&2&&&&&//打开一个framebuffer&object&
&3&&&&&glGenFramebuffersEXT(1,&g_framebuffer);
&4&&&&&glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,g_framebuffer);
&6&&&&&//分配一块RGBA贴图空间给FBO绘图使用&&&&&
&7&&&&&glGenTextures(1,&g_texture);
&8&&&&&glBindTexture(GL_TEXTURE_2D,g_texture);
&9&&&&&//设置filter
10&&&&&glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
11&&&&&glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
12&&&&&//声明贴图大小及格式分配空间
13&&&&&glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,256,256,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
14&&&&&//framebuffer的RGBA贴图-绑定纹理与FBO
15&&&&&glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D,g_texture,0);
17&&&&&//分配zbuffer给FBO&使用&
18&&&&&glGenRenderbuffersEXT(1,&g_depthbuffer);
19&&&&&glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,g_depthbuffer);
20&&&&&glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,GL_DEPTH_COMPONENT24,256,256);
21&&&&&glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT,g_depthbuffer);
22&&&&&GLenum&status&=&glCheckFramebufferStatusEXT(&GL_FRAMEBUFFER_EXT&);
24&&&&&switch(&status&){
25&&&&&&&&case&GL_FRAMEBUFFER_COMPLETE_EXT:
26&&&&&&&&//&&&&MessageBox(NULL,&GL_FRAMEBUFFER_COMPLETE_EXT!&,&SUCCESS&,MB_OK|MB_ICONEXCLAMATION);
27&&&&&&&&&&&&break;
29&&&&&&&&case&GL_FRAMEBUFFER_UNSUPPORTED_EXT:
30&&&&&&&&&&&&MessageBox(NULL,&GL_FRAMEBUFFER_UNSUPPORTED_EXT!&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
31&&&&&&&&&&&&exit(0);
32&&&&&&&&&&&&break;
&1void&myDispaly(){
&3&&&&&&&//使用g_framebuffer&FBO
&4&&&&&glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,g_framebuffer);
&5&&&&&glPushAttrib(GL_VIEWPORT_BIT);
&7&&&&&glViewport(0,0,256,256);
&8&&&&&glClearColor(0.0,0.0,0.0,0.0);
&9&&&&&glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT);
10&&&&&glMatrixMode(&GL_MODELVIEW&);
11&&&&&glLoadIdentity();
12&&&&&glTranslatef(&0.0f,&0.0f,&-5.0f&);
13&&&&&glEnable(GL_TEXTURE_2D);
14&&&&&glBindTexture(GL_TEXTURE_2D,texture[0]);
15&&&&&glRotatef(xrot,0.0,1.0,0.0);
16&&&&&glutSolidTeapot(2.0);
18&&&&&glPopAttrib();
20&&&&&glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);&&&&&
21&&&//&&glViewport(&0,&0,&width,&height);
22&&&&&glClearColor(&0.2f,&0.2f,&0.2f,&1.0f&);
23&&&&&glClear(&GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT&);
24&&&&&glMatrixMode(&GL_MODELVIEW&);
25&&&&&glLoadIdentity();
26&&&&&glRotated&(cam_rot.x,&1.0f,&0.0f,&0.0f);
27&&&&&glRotated&(cam_rot.y,&0.0f,&1.0f,&0.0f);
28&&&&&glRotated&(cam_rot.z,&0.0f,&0.0f,&1.0f);&&&&&&&&&&&&
30&&&&&glTranslatef(0,0,-5);
31&&&&&glEnable(GL_TEXTURE_2D);
32&&&&&glBindTexture(GL_TEXTURE_2D,g_texture);
33&&&&&glScalef(1.5,1.5,1.5);
34&&&&&glRotated&(60,&0.0f,&1.0f,&0.0f);&&&&
35&&&&&glInterleavedArrays(&GL_T2F_V3F,&0,&g_cubeVertices&);
36&&&&&glDrawArrays(&GL_QUADS,&0,&24&);
38&&&&&glutSwapBuffers();
http://blog.chinaunix.net/u/15845/showart_315485.html&
本文已收录于以下专栏:
相关文章推荐
GPU深度发掘(二)::OpenGL FrameBuffer Object 101 
作者:by Rob 'phantom' Jones           &#...
在OpenGL中, OpenGL Context有一个默认的FBO用来绘制图像, 但是我们也可以创建新的用户定义的Framebuffers, 这样我们可以绘制到自定义的framebuffer, 而不会...
Frame Buffer Object(FBO)扩展,被推荐用于把数据渲染到纹理对像。相对于其它同类技术,如数据拷贝或交换缓冲区等,使用FBO技术会更高效并且更容易实现。
在这篇文章中,我将...
副标题1:如何在GPU中存放一些texture以后用副标题2:如何把camera传过来的对应GLES11Ext.GL_TEXTURE_EXTERNAL_OES目标的texture转换为GLES30.G...
又是一个很重要的功能,Framebuffer,
由于《OpenGL ES 2.0 Programming Guide》原书并没有提供第12章的示例代码,书上的代码也只提到关键的步骤,为了加深理解,遂自己实现了一份,希望能够帮助到同样喜欢OpenGL...
问:Xserver使用的是Framebuffer吗?答:Xserver有多种实现,如Xfree86、Xorg等,Xfree86默认不采用Framebuffer;而对于Xorg,可以根据xorg.con...
OpenGL ES 中的FrameBuffer 指的是存储像素的内存空间。对应一个二维图像,如果屏幕分辨率为 ,如果屏幕支持24位真彩色 (RGB),则存储这个屏幕区域的内存至少需要...
OpenGL ES 中的FrameBuffer 指的是存储像素的内存空间。对应一个二维图像,如果屏幕分辨率为 ,如果屏幕支持24位真彩色 (RGB),则存储这个屏幕区域的内存至少需要...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 unity mesh bindposes 的文章

 

随机推荐