opengl教程,opengl渲染gpu怎么设置
opengl教程,opengl渲染gpu怎么设置详细介绍
本文目录一览: opengl教程
1、OpenGL本质上是一个渲染图形的API。它是跨平台、跨语言的,并且非常底层可以和GPU直接交流。目前,OpenGL有四个大版本分为两种编程方式:固定渲染管线和可编程渲染管线编程方式。同时,OpenGL又是一个规范,它由Khronos组织维护,具体实现则是由各个GPU生产商实现的。2、早期OpenGL就是固定渲染管线的编程方式的,OpenGL1.0到4.0都支持。它主要以图元的方式渲染制图,这与微软MFC的GDI很相似,就是通过调用不同的函数画不同的图形。而与之对应的现代OpenGL是可编程渲染管线的编程方式,它更接近底层的GPU渲染,用户操作起来更自由但是更难上手。
nvidia控制面板opengl渲染gpu选择教程
很多用户为了更好的体验游戏而会选择一块更好的显卡,然而好的显卡也是需要好的设置的,今天就给各位玩家带来nvidia控制面板玩游戏最佳设置,一起看看吧。
nvidia控制面板opengl渲染gpu怎么选择:
1、OpenGL是较老式的一种三维显卡,通常是显卡上面有自己的显频处理器,类似于系统的CPU,专门处理三维的加速用的,而不是用系统的CPU。
以前这种显卡较贵,而且是专门给做三维尤其是AutoCAD等软件用的一种显卡。OpenGL有单核也有双核的,显卡的显存也是普通显卡的两倍左右。
2、DirectX里面有所谓的Direct3D的支持,就是假如显卡里面的芯片(普通的三维显卡的芯片,如nVidia的关于三维的处理模式是预设的,而且是硬件支持,假如三维软件需要的三维指令不再显卡的芯片里面,那么CPU就会自动接过来做运算,而OpenGL的显卡的处理器可以自己做运算,不需要用到系统的CPU)有支持三维的指令,那么微软的DirectX中介就会让显卡做计算,假如显卡没有,那么就会是系统的CPU做计算。
3、现在比较高级的显卡都有很多硬件内崁式的指令在显卡的芯片里面。OpenGL是最好的三维,但是价钱较贵。DirectX里面的Direct3D是最普遍的,但是因为三维的指令市场的更新,而芯片里面的指令是属于硬件,无法更新,所以要用到新的三维指令就要另买一个新的三维卡。这也就是为什么nVidia的9800要比9300好,比8500好,因为越高的型号就有越新的三维指令。
4、GoogleEarth是一款使用三维的模式计算和画出图像的软件,是利用非常微小的三角形和多角形来完成不同层次的图像,就像一个三维游戏一样。假如你的显卡支持OpenGL模式,
那么GoogleEarth的绘画功能要较简单,以为大多数的计算过程你的显卡得到。假如你的显卡不支持OpenGL模式,而是DirectX模式,那么GoogleEarth运行就较慢些,
因为软件的更新和三维指令不一定是每一个三维显卡都支持的。所以就要变成较简单的模式了。nVidia的GeFore9300GE应该是以DirectX模式运行的。
还有其他问题的小伙伴可以看看【NVIDIA控制面板常见问题】了解更多有关NVIDIA控制面板的问题~
以上就是给各位小伙伴带来的nvidia控制面板opengl渲染gpu选择教程的所有内容,希望你们会喜欢。更多相关教程请收藏本站~
零基础入门OpenGL系列教程(六、早期OpenGL绘图属性)
点的属性恐怕就只有点的大小了,通过调用 void glPointSize(GLfloat size) 函数可以设置点的大小,传入的参数是一个浮点数代表点的像素。
这个设置是支持 反走样 (antialiasing)的,如果你设置了反走样这个函数同样适用。
线的属性大致有两种,一是线宽,二是样式。
设置线宽和设置点大小一样,通过 void glLineWidth(GLfloat width) 函数来设置,传入的参数也是浮点数。同样支持反走样。
线的样式设置比较有意思,通过 void glLineStipple(GLint factor,GLushort pattern) 函数来设置。第一个参数是因子,我把它简单的理解为线条样式拉伸的系数,第二个参数比较有趣,它是用来描绘具体样式的16位整数。1对应实线,0对应空白,通过这种方法表现出来样式。
这是我画的虚线,对应的样式是0x0A0A。在设置样式的时候需要调用 glEnable(GL_LINE_STIPPLE) 函数打开线段样式渲染状态。
即使是二维的平面也分为正面和背面,比如说如果我顺时针方向渲染的点为正面,那么逆时针渲染的点就是背面了。有了这一概念我们就可以单独的对图形的某一个面操作,比如说正面填充背面描边。
void glFrontFace(GLenum mode) 可以设置图形的正面与背面(相反的为背面),参数是顺时针或逆时针。 void glPolygonMode(GLenum face,GLenum mode) 可以分别对正面或背面以不同方式渲染。举个例子。
我通过顺时针和逆时针两种方式画的两个三角形,渲染结果是不同的。
此外, void glEdgeFlag( GLboolean flag) 函数可以指定边是否是边界,如果不是可以隐藏它。
通过这个特性我简单的画了一个“二”。
关于面的属性还有很多。比如样式、纹理甚至雾化效果,这个在现代OpenGL里面再说吧。
OpenGL ES实践教程(八)blend混合与shader混合
OpenGL ES实践教程1-Demo01-AVPlayer OpenGL ES实践教程2-Demo02-摄像头采集数据和渲染 OpenGL ES实践教程3-Demo03-Mirror OpenGL ES实践教程4-Demo04-VR全景视频播放 OpenGL ES实践教程5-Demo05-多重纹理实现图像混合 OpenGL ES实践教程6-Demo06-全景视频获取焦点 OpenGL ES实践教程7-Demo07-多滤镜叠加处理 其他教程请移步 OpenGL ES文集 。
在 OpenGL ES实践教程5-Demo05-多重纹理实现图像混合 尝试把两个图像用多重纹理的方式进行混合,这次补充介绍其他混合方式--blend混合与shader混合。 不同于多重纹理用一个shader读取两个纹理单元的图像数据; 不同于滤镜链,第一个滤镜以纹理单元0为输入,输出到纹理单元1,第二个再以纹理单元1为输出; blend混合与shader混合是在 原来的绘制基础上,接着绘制图形 。
blend混合是在绘制图形时,把要绘制的颜色与当前缓冲区里面的颜色按照特定的混合方式进行叠加。blend混合常用在绘制透明的图形,会用到RGBA颜色空间中的alpha值。 混合过程中可以通过glBlendFunc设定对应的混合方式,常见的混合模式如下:
OpenGL中如何给被渲染的物体设置光照和材质
你说的是新版本还是老版本?
老版本的OPENGL,可以用GLUT库。一两句话说不通,可以看看计算机图形学OPENGL版,不过有些都过时了。
新版本的直接在着色器管线上设置。可以看看learnopengl,里面有例程,直接在这里说确实也不方便,教程上解释的都比较清楚。
1、首先,在菜单栏上单击“渲染-渲染设置”,锁定框架的纵横比,然后将“宽度和高度”选择为“ 3200 * 2250”,如下图所示,然后进入下一步。
2、其次,完成上述步骤后,依次单击vray-->全局开关-->关闭全局照明选项,取消勾选“不渲染最终的图像”选项,如下图所示,然后进入下一步。
3、接着,完成上述步骤后,依次单击图像采样器-->类型-->自适应确定性蒙特卡洛、自适应细分,颜色贴图-->类型-->线性倍增,打开“抗锯齿过滤”选项,如下图所示,然后进入下一步。
4、然后,完成上述步骤后,依次单击间接照明-->打开间接照明,在一次反弹里面选择“发光图”选项,在二次反弹里面选择“灯光缓存”选项,如下图所示,然后进入下一步。
5、随后,完成上述步骤后,依次单击发光图-->在当前预设中选择低-->半球细80-->插值采样50选项,如下图所示,然后进入下一步。
6、接着,完成上述步骤后,这是光缓冲区,被1800细分,如下图所示,然后进入下一步。
7、然后,完成上述步骤后,以下是DMC采样器设置,如下图所示,然后进入下一步。
8、随后,完成上述步骤后,以下是渲染区域划分设置和区域排序,可以选择从上到下,从左到右或其他方式,如下图所示,然后进入下一步。
9、最后,完成上述步骤后,保存预设,设置完成,如下图所示。这样,问题就解决了。
初学自学。C游戏编程,应看那些书?
《Windows游戏编程大师技巧》这书的代码就不要看了。。。
都不是面向对象的。。但思想还是好的。
游戏编程不一定就是DX独大,一般都要兼容OPENGL的。
你也可以从OPENGL上学。
书实在是太多了。不过最好是看国外的写的书。。
国内的书都是骗钱的。。
特别是“房晓溪”这个人的书。。
我推荐几本初学的2D《VisualC++游戏编程基础》
《VisualC++经典游戏程序设计》一般现在都可以直接学3D,学好3D,2D就不在话下了《nehe教程》这个是只有电子书,很好的OPENGL教程,让你对3D图形更感兴趣呵呵《OPENGL游戏编程》,作者徐明亮,感觉算国内比较好的书了《3D游戏编程大师技巧》,这书跟《Windows游戏编程大师技巧》有点联系,不过不多,反正也是看思想,代码也不要看了。
还有好多书可以去电驴上载。。。
太多了,游戏中的每一个部分都可以单独写成一本书。。
以后还要更细化的。。
祝你成功,为中国游戏做贡献。
如何使用Android中的OpenGL ES媒体效果
准备
为了开始本次的教程,你必须具备:
1.一款支持Android开发的IDE,如果你没有的话,可以在Android Developer website下载最新版本的Android studio。
2.一款运行Android4.0之上Android手机,并且GPU支持OpenGL ES2.0
3.对OpenGL的基本知识了解
设置OpenGL ES环境
创建GLSurfaceView
为了显示OpenGL的图形,你需要使用GLSurfaceView类,就像其他任何的View子类意义,你可以将它添加到你的Activity或Fragment之上,通过在布局xml文件中定义或者在代码中创建实例。
在本次的教程中,我们使用GLSurfaceView作为唯一的View在我们的Activity中,因此,为了简便,我们在代码中创建
GLSurfaceView的实例并将其传入setContentView中,这样它将会填充你的整个手机屏幕。Activity中的onCreate方
法如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView view = new GLSurfaceView(this);
setContentView(view);
}123456123456
因为媒体效果的框架仅仅支持OpenGL ES2.0及以上的版本,所以在setEGLContextClientVersion 方法中传入2;
view.setEGLContextClientVersion(2);11
为了确保GLSurfaceView仅仅在必要的时候进行渲染,我们在setRenderMode 方法中进行设置:
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);11
创建Renderer
Renderer负责渲染GLSurfaceView中的内容。
创建类实现接口GLSurfaceView.Renderer,在这里我们打算将这个类命名为EffectsRenderer,添加构造函数并覆写接口中的抽象方法,如下:
public class EffectsRenderer implements GLSurfaceView.Renderer {
public EffectsRenderer(Context context){
super();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
}
@Override
public void onDrawFrame(GL10 gl) {
}
}123456789101112138008123456789101112138008
回到Activity中调用setRenderer方法,让GLSurfaceView使用我们创建的Renderer:
view.setRenderer(new EffectsRenderer(this));11
编写Manifest文件
如果你想要发布你的App到谷歌商店,在AndroidManifest.xml文件中添加如下语句:
11
这会确保你的app只能被安装在支持OpenGL ES2.0的设备之上。现在OpenGL环境准备完毕。
创建一个OpenGL平面
定义顶点
GLSurfaceView是不能直接显示一张照片的,照片首先应该被转化为纹理,应用在OpenGL square之上。在本次教程中,我将创建一个2D平面,并且具有4个顶点。为了简单,我将使用一个长方形,现在,创建一个新的类Square,用它来代表形状。
public class Square {
}123123
默认的OpenGL系统的坐标系中的原点是在中心,因此4个角的坐标可以表示为:
左下角: (-1, -1)
右下角:(1, -1)
右上角:(1, 1)
左上角:(-1, 1)
我们使用OpenGL绘制的所有的物体都应该是由三角形决定的,为了画一个方形,我们需要两个具有一条公共边的三角形,那意味着这些三角形的坐标应该是:
triangle 1: (-1, -1), (1, -1), 和 (-1, 1)
triangle 2: (1, -1), (-1, 1), 和 (1, 1)
创建一个float数组来代表这些顶点:
private float vertices[] = {
-1f, -1f,
1f, -1f,
-1f, 1f,
1f, 1f,
};123456123456
为了在square上定位纹理,需要确定纹理的顶点坐标,创建另一个数组来表示纹理顶点的坐标:
private float textureVertices[] = {
0f,1f,
1f,1f,
0f,0f,
1f,0f
};123456123456
创建缓冲区
这些坐标数组应该被转变为缓冲字符(byte buffer)在OpenGL可以使用之前,接下来进行定义:
private FloatBuffer verticesBuffer;
private FloatBuffer textureBuffer;1212
在initializeBuffers方法中去初始化这些缓冲区:使用ByteBuffer.allocateDirect来创建缓冲区,因为float是4个字节,那么我们需要的byte数组的长度应该为float的4倍。
下面使用ByteBuffer.nativeOrder方法来定义在底层的本地平台上的byte的顺序。使用asFloatBuffer方法将
ByteBuffer转化为FloatBuffer,在FloatBuffer被创建后,我们调用put方法来将float数组放入缓冲区,最后,调用
position方法来保证我们是由缓冲区的开头进行读取。
private void initializeBuffers(){
ByteBuffer buff = ByteBuffer.allocateDirect(vertices.length * 4);
buff.order(ByteOrder.nativeOrder());
verticesBuffer = buff.asFloatBuffer();
verticesBuffer.put(vertices);
verticesBuffer.position(0);
buff = ByteBuffer.allocateDirect(textureVertices.length * 4);
buff.order(ByteOrder.nativeOrder());
textureBuffer = buff.asFloatBuffer();
textureBuffer.put(textureVertices);
textureBuffer.position(0);
}1234567891011121380010111213
创建着色器
着色器只不过是简单的运行在GPU中的每个单独的顶点的C程序,在本次教程中,我们使用两种着色器:顶点着色器和片段着色器。
顶点着色器的代码:
attribute vec4 aPosition;
attribute vec2 aTexPosition;
varying vec2 vTexPosition;
void main() {
gl_Position = aPosition;
vTexPosition = aTexPosition;
};12345671234567
片段着色器的代码
precision mediump float;
uniform sampler2D uTexture;
varying vec2 vTexPosition;
void main() {
gl_FragColor = texture2D(uTexture, vTexPosition);
};123456123456
如果你了解OpenGL,那么这段代码对你来说是熟悉的,如果你不能理解这段代码,你可以参考OpenGL documentation。这里有一个简明扼要的解释:
顶点着色器负责绘制单个顶点。aPosition是一个变量被绑定到FloatBuffer上,包含着这些顶点的坐标。相似
的,aTexPosition 是一个变量被绑定到FloatBuffer上,包含着纹理的坐标。gl_Position
是一个在OpenGL中创建的变量,代表每一个顶点的位置,vTexPosition是一个数组变量,它的值被传递到片段着色器中。
在本教程中,片段着色器负责square的着色。它使用texture2D方法从纹理中拾取颜色,并且使用一个在OpenGL中被创建的变量gl_FragColor将颜色分配到片段。
在该类中,着色器的代码应该被转化为String。
private final String vertexShaderCode =
"attribute vec4 aPosition;" +
"attribute vec2 aTexPosition;" +
"varying vec2 vTexPosition;" +
"void main() {" +
" gl_Position = aPosition;" +
" vTexPosition = aTexPosition;" +
"}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform sampler2D uTexture;" +
"varying vec2 vTexPosition;" +
"void main() {" +
" gl_FragColor = texture2D(uTexture, vTexPosition);" +
"}";1234567891011121380045678910111213141516
创建程序
创建新的方法initializeProgram来创建一个编译和链接着色器的OpenGL程序。
使用glCreateShader创建一个着色器对象,并且返回以int为表示形式的指针。为了创建顶点着色器,传递
GL_VERTEX_SHADER给它。相似的,为了创建一个片段着色器,传递GL_FRAGMENT_SHADER给它。下面使用
glShaderSource方法关联相对应的着色器代码到着色器上。使用glCompileShader编译着色器代码。
在编译了着色器的代码后,创建一段新的的程序glCreateProgram,与glCreateShader相似,它也返回一个以int为表示形式的指针。调用glAttachShader方法附着着色器到程序中,最后,调用glLinkProgram进行链接。
代码:
private int vertexShader;
private int fragmentShader;
private int program;
private void initializeProgram(){
vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
GLES20.glShaderSource(vertexShader, vertexShaderCode);
GLES20.glCompileShader(vertexShader);
fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
GLES20.glShaderSource(fragmentShader, fragmentShaderCode);
GLES20.glCompileShader(fragmentShader);
program = GLES20.glCreateProgram();
GLES20.glAttachShader(program, vertexShader);
GLES20.glAttachShader(program, fragmentShader);
GLES20.glLinkProgram(program);
}1234567891011121380081380010111213800819
你可能会发现,OpenGL的方法(以gl开头的)都是在GLES20类中,这是因为我们使用的是OpenGL ES2.0,如果我们使用更高的版本,就会用到这些类:GLES30,GLES31。
画出形状
现在定义draw方法来利用我们之前定义的点和着色器进行绘制。
下面是你需要做的:
1.使用glBindFramebuffer方法创建一个帧缓冲对象(FBO)
2.调用glUseProgram创建程序,就像之前所提
3.传递GL_BLEND给glDisable方法,在渲染过程中禁用颜色的混合。
4.调用glGetAttribLocation得到变量aPosition和aTexPosition的句柄
5.使用glVertexAttribPointer连接aPosition和aTexPosition的句柄到各自的verticesBuffer和textureBuffer
6.使用glBindTexture方法绑定纹理(作为draw方法的参数传入)到片段着色器上
7.调用glClear方法清空GLSurfaceView的内容
8.最后,使用glDrawArrays方法画出两个三角形(也就是方形)
代码:
public void draw(int texture){
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glUseProgram(program);
GLES20.glDisable(GLES20.GL_BLEND);
int positionHandle = GLES20.glGetAttribLocation(program, "aPosition");
int textureHandle = GLES20.glGetUniformLocation(program, "uTexture");
int texturePositionHandle = GLES20.glGetAttribLocation(program, "aTexPosition");
GLES20.glVertexAttribPointer(texturePositionHandle, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
GLES20.glEnableVertexAttribArray(texturePositionHandle);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
GLES20.glUniform1i(textureHandle, 0);
GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, verticesBuffer);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}1234567891011121380081380045678910111213800819202122
在构造函数中添加初始化方法:
public Square(){
initializeBuffers();
initializeProgram();
}12341234
渲染OpenGL平面和纹理
现在我们的渲染器什么也没做,我们需要改变它来渲染我们在前面创造的平面。
首先,让我们创建一个Bitmap,添加一张照片到res/drawable文件夹之下,我把它命名为forest.jpg,使用BitmapFactory将照片转化为Bitmap。另外将照片的尺寸存储下来。
改变EffectsRenderer的构造函数如下,
private Bitmap photo;
private int photoWidth, photoHeight;
public EffectsRenderer(Context context){
super();
photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.forest);
photoWidth = photo.getWidth();
photoHeight = photo.getHeight();
}1234567812345678
opengl渲染gpu怎么设置
gpu渲染设置步骤如下:
1、首先,单击菜单栏上的“渲染渲染设置”(F10),锁定图幅的纵横比,然后选择“3200*2250”作为“宽度和高度”。
2、然后,Vray-global开关-关闭全局照明,不进行检查就不会渲染最终图像。
3、然后,对图像采样器型自适应确定性蒙特卡罗、自适应细分、彩色地图型线性乘法,启用抗混叠滤波。
4、接下来,间接照明-启用间接照明-在第一次反弹中选择“灯光贴图”-在第二次反弹中选择“灯光缓存”。
5、接下来,发光图-在当前预设-内插采样50中选择低半球80。
6、然后这是灯光缓存,按1800细分。
7、然后下面是DMC采样器设置。
8、以下是渲染区域划分设置和区域顺序,可以从上到下、从左到右或其他方式进行选择。
9、最后保存预设,设置完成。
OpenGL被定义为“图形硬件的一种软件接口”。从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度。
OpenGL默认的渲染步骤基本是在GPU上执行的
使用GPU渲染的话,你得用到GLSL,使用着色器语言
可以看下红皮书后面的GLSL简介,还有CG教程
gpu渲染设置步骤如下:
1、首先,单击菜单栏上的“渲染-渲染设置”(F10),锁定图幅的纵横比,然后选择“3200*2250”作为“宽度和高度”。
2、然后,vray——全局开关——关闭全局照明,不渲染最终的图像不打勾。
3、再然后,图像采样器——类型——自适应确定性蒙特卡洛、自适应细分,颜色贴图——类型——线性倍增,打开抗锯齿过滤。
4、下面,间接照明——打开间接照明——在一次反弹里面选择“发光图”——在二次反弹里面选择“灯光缓存”。
5、下面,发光图-在当前预设中选择低-半球细80-插值采样50。
6、这是灯光缓存,按1800细分。
7、下面是DMC采样器设置。
8、下面是渲染区域划分设置和区域排序。您可以从上到下、从左到右或其他方式进行选择。
9、保存预设,设置完成。
在Qt下如何使用OpenGL进行绘图
Qt Creator中的3D绘图及动画教程(参照NeHe)
刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用OpenGL进行绘图渲染。虽然里面还是由不少专业的解释照搬原文的,但还是加入了大量自己的分析。而且Qt中写OpenGL框架上比VC简单太多了,有不少东西都封装优化好了,代码上还是由有很多区别的。当然,其中原教程没解释好的问题我都作了深入的解释,以及一些多余部分解释、代码都被我删掉简化了。
这份Qt OpenGL的3D绘图及动画教程,我基本会按照Nehe的OpenGL教程,只是将代码的实现运用到Qt Creator中,当然其中加了。
下面对Qt中OpenGL做一个简要介绍:
Qt中OpenGL主要是在QGLWidget类中完成的,而要使用QtOpenGL模块,需要在项目文件( .pro)中添加代码"QT+=opengl"。
QGLWidget类是一个用来渲染OpenGL图形的部件,提供了在Qt中显示OpenGL图形的功能。这个类使用起来很简单,只需要继承该类,然后像使用其他QWidget部件一样来使用它。QGLWidget提供了3个方便的纯虚函数,可以在子类中通过重新实现它们来执行典型的OpenGL任务:
initializeGL():设置OpenGL渲染环境,定义显示列表等。该函数只在第一次调用resizeGL()或paintGL()前被自动调用一次。
resizeGL():设置OpenGL的视口、投影等。每次部件改变大小时都会自动调用该函数。
paintGL():渲染OpenGL场景。每当部件需要更新时都会调用该函数。
(以上3个虚函数更具体的调用情况我会用另一篇文章来讲明)
也就是说,Qt中当创建并显示出一个QGLWidget子对象时,会自动依次调用initializeGL()、resizeGL()、paintGL(),完成当前场景的绘制;而当某些情况发生时,会根据情况决定是否自动调用initializeGL()、resizeGL(),一旦调用initializeGL()、resizeGL()了,会紧跟着调用paintGL()对场景进行重新绘制。