opengl编程一(使用着色器)

opengl

opengl简介

gl是一套图形编程API,是图形应用开发的工业标准接口,每个平台都有相应的实现。可视化的操作系统都提供了图形编程接口,通常这一系列的接口作为操作系统的一个系统服务,为客户提供窗口渲染。那为什么还用gl呢?系统提供的这些服务并不是针对gpu进行优化的,通常接口是为2d渲染提供服务的,3d没提供直接支持。还有各个平台的接口不一样,移植很困难。而使用opengl除了移植外,它针对gpu提供了高效的操作,为3d开发提供了原生的支持。gl并不作为系统的一个核心服务,它为众多厂商指定标准,由相应的gpu开发商实现驱动。gl通常作为一个驱动程序安装在系统上面,它同样需要与系统的原生态窗口系统进行交互,把最终渲染数据交由窗口系统。任何系统之上的服务都绕不过系统服务这个坎,而跟系统交互,存在一个上下文切换的问题,系统服务运行在内核态,以提高系统的安全稳健。用户程序中的非系统调用都是运行在用户态,它们的崩溃、出错不会影响系统的不稳定,会被系统关闭。所以这里存在着一个上下文切换的开销。那么使用gl也同样存在上下文切换开销,只不过切换大量减少了。对于直接使用系统的GDI,每次调用导致一个切换显然对于专门的图形应用程序来说花销太大,而对于gl驱动来讲,它部分在用户态执行,可以减少一些开销。gl的一个实现mesa3d

使用gl就是向它发送数据,以及发送命令,命令有对数据的操作命令,也有渲染命令。一开始的时候,gl没有提供在gpu上进行编程的接口,用户不能利用gpu进行编程,无法对将要被渲染的数据进行处理。只能在数据发送给gl之前进行处理,也就改改顶点位置、颜色、纹理坐标等等,要想改变最终的片元颜色,不得而知了。gl1.5后推出了着色器,让gl大显身手,可以对顶点与片元进行编程。代码书写也发生了变化,需要编写着色器代码。下面分析gl的基本接口,以及gl的缓存功能。gl缓存的目的是为了减小数据传输,这个看似一般的功能,在gl中很重要。同时我会张贴一些接口的实现伪代码,方便理解函数实现,接口调用原理。

一个简单的列子

下面查看如何使用着色器渲染一个四边形,现在写渲染都是要编写着色器,着色器代码并不是一两个接口的问题,涉及的接口有点多,但是着色器的创建形式固定。gl一开始需要跟系统的窗口系统建立联系,对于窗口的建立,表面生成,最终的显示,gl都是没有权利直接去做的,必须调用系统的图像服务去完成。下面使用glut库去完成这个功能,glut为不同平台提供了统一接口,网上也有源码。代码如下:

int main(int argc, const char * argv[]) {
    glutInit(&argc, (char **)argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize (640, 480);
    glutInitWindowPosition (1000, 100);
    glutCreateWindow ("graphics with opengl");
    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}

上面代码很固定,glutInitDisplayMode描述了显示模式,GLUT_DOUBLE表明使用两个表面,其中一个离屏的,这样gl把操作的结果都写入这个离屏的表面,最后更显示表面交换,显示器一下子把数据刷新显示到显示器上。不使用双表面会有个问题,当一帧间隔大于显示器刷新频率时,假如2个hz一次渲染计算,显示器60hz/s,那么渲染一半,过了1hz,这个时候显示器刷新了,还没画完整的图被渲染出来了。再过1hz一帧才被完全计算渲染。所有这里用GLUT_DOUBLE。GLUT_RGBA表示表面4个颜色分类。后面的几个函数是设置窗口的大小、左上角位置、窗口标题。加入要自定义窗口,那么就不能用glut,得自己使用系统的窗口系统api了。glutDisplayFunc的参数函数是窗口接收到重绘消息时,调用的,本人MAC系统建立窗口后发出两次重建命令,你可以在display里打印log看下输出几次。此外每次窗口大小改变也会发生窗口重绘消息,调用display。glutMainLoop是进入消息循环,后面retuen 0等到窗口接到关闭窗口后才会被调用。上面没有加入每隔多少毫秒进行帧刷新,使用glutIdleFunc可以实现空闲时刷新,在里面加个时间判断就OK了。现在窗口建立起来了,还需要在display里面向gl传输数据与命令,让它渲染。

void display(){
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    drawQuad();
    glSwapAPPLE();
}

上面代码就是向gl发送一些列的命令,其中drawQuad是客户函数,其它三个gl开头的函数是gl接口。第一个glClearColor设置gl上下文中用于清除几个用于渲染的缓存(合成表面)的颜色为黑色,gl有颜色、深度等等缓存,这些缓存有不同作用,颜色缓存存储片元最终颜色,深度缓存存储每个片元的深度。其中上面代码清除颜色帧缓存为全0,glClear执行清除,glSwapAPPLE交换前后表面。之所以要这样做,因为opengl初始化时产生的这几个缓存并不去赋值,里面的数据不得而知,可能是之前显示的一幅画面,当你给它发送渲染命令后,颜色帧缓存中没被覆盖的像素点,就会显示出来,显然不是你想要的结果。所以这里的操作也是一个定式。drawQuad是用来给gl

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用OpenGL编程可以实现三维渲染实体。具体步骤包括:定义实体的顶点坐标、法向量、纹理坐标等信息,创建着色器程序,设置视角和投影矩阵,绑定纹理,绘制实体等。通过这些步骤,可以实现一个逼真的三维渲染实体。 ### 回答2: OpenGL是一个跨平台的图形库,被广泛应用于计算机图形学的领域。它可以用来实现2D和3D图形的绘制和渲染。在这里我们将重点讨论如何使用OpenGL编程实现一个三维渲染实体。 1. 准备工作 在编写OpenGL程序前,需要先安装OpenGL相关的库文件。OpenGL的基本库文件包括gl.h、glu.h、glut.h等,我们需要根据自己的操作系统安装对应版本的库文件。同时,为了增强程序的可读性和可维护性,我们可以选择使用一些工具,比如GLFW、GLEW等。接下来,我们需要编写程序代码,这个过程需要用到C++或者其他编程语言。 2. 绘制实体 在OpenGL中,我们使用一系列的顶点和一些连接它们的线来描述一个3D实体。在OpenGL中,可以通过向OpenGL指定物体的三个坐标轴上的点来定义它们。OpenGL使用 glVertex3f() 函数来指定一个点的三个坐标轴上的位置。我们可以通过调用glBegin()和glEnd()之间的代码块来指定实体的顶点和它们的属性。使用glVertex3f()函数可以指定每个顶点的位置和颜色。此外,还可以使用glColor3f()函数来定义每个点的颜色。 3. 设置材质和光照属性 为了让实体看起来更加真实,需要配置材质和光照属性。在OpenGL中,可以使用 glMaterial*()函数来指定材质属性,并使用glLight*()函数来指定光照属性。当OpenGL渲染实体时,它会将每个像素着色,同时使用光照和材质属性来计算每个像素的颜色。 4. 添加纹理 为了让实体具有更多的细节和真实感,我们可以添加纹理。通过将纹理映射到实体的顶点上,可以在实体表面上显示具有纹理的图像,例如木纹、金属纹等。在OpenGL中,可以使用glTexImage*()函数指定纹理图像,并使用glTexEnv*()函数来设置纹理属性。 5. 渲染的最后一步 最后一步就是调用glutMainLoop()函数来启动OpenGL的渲染循环。该函数将会循环地渲染场景,直到程序结束。在渲染场景时,通过用户的交互,可以控制摄像机的位置和角度,从而改变场景的视角。 综上,我们通过使用OpenGL库、准备工作、绘制实体、设置材质和光照属性、添加纹理和渲染的最后一步这几个步骤,就可以快乐地实现一个三维渲染实体了。 ### 回答3: OpenGL是一个开放的图形库,可用于将2D和3D图形渲染到计算机屏幕上。通过使用OpenGL编程,我们可以实现许多不同种类的三维渲染实体,如下所示: 第一步:准备环境 要开始使用OpenGL编程,我们需要先准备好开发环境。首先,我们需要安装OpenGL SDK和GLUT库文件。然后,我们需要设置项目的开发环境,使其可以识别和链接OpenGL库。 第二步:创建窗口 我们需要创建一个窗口,以便我们可以在其中渲染3D实体。在OpenGL中,这可以通过在函数中调用glutCreateWindow()来完成。 第三步:设置视图和投影 在OpenGL中,我们需要设置视图和投影,以便我们可以正确渲染3D物体。我们需要调用glMatrixMode()和glLoadIdentity()函数,以便我们可以设置一个矩阵来定义3D物体的位置、方向和大小。 第四步:定义3D实体 我们需要为我们的3D实体定义几何形状。在OpenGL中,我们可以使用提供的函数来定义3D实体的几何形状,例如glVertex3f()函数来定义3D坐标,并使用glBegin()函数和glEnd()函数将它们包含在一个形状内部。 第五步:渲染3D实体 一旦我们定义了3D实体的几何形状,我们可以使用OpenGL的渲染功能来绘制它们。我们需要在函数内调用glClear()函数,以便我们可以清除窗口中的颜色。然后,我们可以调用glBegin()函数,并使用glVertex3f()函数来指定要绘制的3D几何形状。最后,我们需要使用glEnd()函数将几何形状绘制出来。 综上所述,通过使用OpenGL编程可以实现三维渲染实体。我们需要在准备环境中安装OpenGL SDK和GLUT库文件并设置开发环境。然后,我们需要创建一个窗口,设置视图和投影,定义3D实体,最后渲染3D实体。这个过程需要学习和实践,更多的细节可以通过教程或OpenGL API手册进行深入了解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值