opengl简介及实例
- 格式:doc
- 大小:90.50 KB
- 文档页数:9
opengl 球镜面菲涅尔效应OpenGL球镜面菲涅尔效应引言:菲涅尔效应是指光线从一种介质射向另一种介质时,由于折射和反射的存在,所产生的光的强度变化现象。
而在OpenGL中,通过对球镜面进行渲染和光照处理,可以模拟出球镜面上的菲涅尔效应。
一、OpenGL简介OpenGL是一种跨平台的图形编程接口,广泛应用于游戏开发、科学可视化、工业设计等领域。
它通过对图形硬件的底层控制,提供了强大的图形渲染功能和灵活的开发接口。
二、球镜面的渲染在OpenGL中,球镜面可以通过数学公式生成或者使用模型文件导入。
球镜面的渲染主要包括以下几个步骤:1. 创建球体模型:通过数学公式或者模型文件导入,创建球体模型。
球体模型可以根据需求进行细分,以获得更加精细的渲染效果。
2. 设置材质和纹理:球镜面的菲涅尔效应和光照密切相关,因此在渲染之前需要设置球体的材质属性和纹理贴图。
材质属性包括反射率、折射率等,纹理贴图可以用于模拟球体表面的纹理和光照变化。
3. 设置光源:光源的设置对于球镜面的菲涅尔效应非常重要。
通过设置光源的位置、颜色和强度等参数,可以模拟出球体表面因光照而产生的明暗变化。
4. 进行光照计算:OpenGL提供了多种光照模型,可以根据需要选择适合的光照模型。
光照计算主要包括环境光、漫反射光和镜面反射光的计算,其中漫反射光和镜面反射光对于球镜面的菲涅尔效应影响较大。
5. 执行渲染:将球体模型、材质属性、光源设置和光照计算应用到OpenGL渲染管线中,执行球镜面的渲染。
通过调整渲染参数和光照参数,可以获得不同的菲涅尔效应效果。
三、球镜面的菲涅尔效应球镜面的菲涅尔效应是指光线从空气等介质射向球镜面时,由于折射和反射的存在,光的强度会发生变化。
菲涅尔效应的强度变化与入射角度、反射系数和折射系数等因素有关。
在OpenGL中,可以通过调整反射系数和折射系数来模拟球镜面的菲涅尔效应。
反射系数和折射系数的取值范围为0到1,分别表示完全反射和完全折射。
opengl使用手册简书(原创实用版)目录一、OpenGL 简介二、OpenGL 函数库1.核心函数库2.矩阵操作、几何变换和投影变换函数3.交互式输入设备函数三、OpenGL 扩展库 GLEW正文一、OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。
OpenGL 提供了一套完整的图形渲染 API,可以实现各种视觉效果,如颜色、光照、阴影、纹理贴图等。
它广泛应用于游戏开发、计算机辅助设计、虚拟现实、科学可视化等领域。
二、OpenGL 函数库OpenGL 函数库包含许多可以用于绘制图形的函数。
这些函数可以根据其功能分为不同的类别,主要包括:1.核心函数库:这个库包含了 OpenGL 的基本功能,如绘制基本的几何图元(glBegin)、设置颜色(glColor3f)等。
2.矩阵操作、几何变换和投影变换函数:这个库包含了用于操作矩阵、实现几何变换和投影变换的函数。
例如,矩阵入栈(glPushMatrix)、矩阵出栈(glPopMatrix)、矩阵乘法(glMultMatrix)等。
3.交互式输入设备函数:这个库包含了用于处理交互式输入设备的函数,例如鼠标和键盘。
这些函数可以让用户在程序中进行操作,如点击、拖动、滚动等。
三、OpenGL 扩展库 GLEWGLEW(GL Extension Wrangler Library)是一个 OpenGL 扩展库,用于简化 OpenGL 扩展的加载和使用过程。
GLEW 提供了一系列的函数,用于查询、启用和禁用 OpenGL 扩展。
使用 GLEW,开发者无需关心扩展的加载和启用,只需关注功能的实现。
总之,OpenGL 是一套功能强大的图形编程接口,包含了丰富的函数库,可以实现各种复杂的图形渲染效果。
OpenGL使⽤第⼀讲:基本概念前⾔随着计算机多媒体技术、可视化技术及图形学技术的发展,我们可以使⽤计算机来精确地再现现实世界中的绚丽多彩的三维物体,并充分发挥⾃⾝的创造性思维,通过⼈机交互来模拟、改造现实世界,这就是⽬前最为时髦的虚拟现实技术。
通过这种技术,建筑⼯程师可以直接设计出美观的楼房模型;军事指挥员可以模拟战场进⾏军事推演,⽹民可以⾜不出户游览故宫博物馆等名胜古迹等。
⽽虚拟现实技术最重要的⼀部分内容就是三维图形编程。
当前,三维图形编程⼯具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语⾔),它已经成为⼀个⼯业标准的计算机三维图形软件开发接⼝,并⼴泛应⽤于游戏开发、建筑、产品设计、医学、地球科学、流体⼒学等领域。
值得⼀提的是,虽然微软有⾃⼰的三维编程开发⼯具DirectX,但它也提供OpenGL图形标准,因此,OpenGL 可以在微机中⼴泛应⽤。
⽬前,OpenGL在国内外都掀起了热潮,但国内对这⼀领域介绍的资料并不是很多,特别是有志于在图形图像⽅⾯进⾏深⼊研究的读者朋友,常常苦于不掌握OpenGL编程接⼝技术,⽆法向纵深领域扩展。
为了开启三维图形编程这扇神秘⼤门,本讲座在结合OpenGL 有关理论知识的基础上,着重介绍Visual C++6.0开发环境中的编程实现,由于⽔平有限,本讲座可能⽆法⾯⾯俱到,存在⼀些疏漏,但相信它可以将开启"神秘⼤门"的钥匙交给读者朋友们。
⼀、OpenGL的特点及功能OpenGL是⽤于开发简捷的交互式⼆维和三维图形应⽤程序的最佳环境,任何⾼性能的图形应⽤程序,从3D动画、CAD辅助设计到可视化访真,都可以利⽤OpenGL⾼质量、⾼性能的特点。
OpenGL⾃1992年出现以来,逐渐发展完善,已成为⼀个唯⼀开放的,独⽴于应⽤平台的图形标准,⼀个典型的OpenGL应⽤程序可以在任何平台上运⾏--只需要使⽤⽬标系统的OpenGL库重新编译⼀下。
第一讲:基本概念前言随着计算机多媒体技术、可视化技术及图形学技术的发展,我们可以使用计算机来精确地再现现实世界中的绚丽多彩的三维物体,并充分发挥自身的创造性思维,通过人机交互来模拟、改造现实世界,这就是目前最为时髦的虚拟现实技术。
通过这种技术,建筑工程师可以直接设计出美观的楼房模型;军事指挥员可以模拟战场进行军事推演,网民可以足不出户游览故宫博物馆等名胜古迹等。
而虚拟现实技术最重要的一部分内容就是三维图形编程。
当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口,并广泛应用于游戏开发、建筑、产品设计、医学、地球科学、流体力学等领域。
值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL 可以在微机中广泛应用。
目前,OpenGL在国内外都掀起了热潮,但国内对这一领域介绍的资料并不是很多,特别是有志于在图形图像方面进行深入研究的读者朋友,常常苦于不掌握OpenGL编程接口技术,无法向纵深领域扩展。
为了开启三维图形编程这扇神秘大门,本讲座在结合OpenGL 有关理论知识的基础上,着重介绍Visual C++6.0开发环境中的编程实现,由于水平有限,本讲座可能无法面面俱到,存在一些疏漏,但相信它可以将开启"神秘大门"的钥匙交给读者朋友们。
一、OpenGL的特点及功能OpenGL是用于开发简捷的交互式二维和三维图形应用程序的最佳环境,任何高性能的图形应用程序,从3D动画、CAD辅助设计到可视化访真,都可以利用OpenGL高质量、高性能的特点。
OpenGL自1992年出现以来,逐渐发展完善,已成为一个唯一开放的,独立于应用平台的图形标准,一个典型的OpenGL应用程序可以在任何平台上运行--只需要使用目标系统的OpenGL库重新编译一下。
[OPENGL怎么用]OPENGL编程类似C编程,实际接口就是C,所以熟悉C是必要的一般编程可用到的函数库包括:OPENGL实用库:函数以glu开头OPENGL辅助库:函数以aux开头Windows专用函数库:函数以wgl开头Win32API:无专用前缀OPENGL中有115个核心函数,可以在任何OPENGL平台上使用OPENGL实用库比上面这115个函数高一级,提供高级调用OPENGL辅助库本来是提供初学者入门的函数,不保证在任何平台的使用但恰好可以在WIN32下使用,所以本讲座将大量引用WIN32下OPENGL编程有两个方便途径:1使用辅助库2使用C++基于消息驱动的编程显然1要简单一些,入门从这里开始吧。
[用之前的准备]1首先你需要下列*.lib包含在你的工程中:opengl32.lib glu32.lib glaux.lib本讲座所有例子“将”在VC5下调试通过,所以从project->setting->link->general->object/libary modules中加入上面三个*.lib(这些LIB,VC4以上版本已经自带,加入即可,不用在四处搜寻文件)2另外在你的运行程序路径下或\win95\system\下你需要一些*.dll动态连接库opengl32.dll glu32.dll rxddi.dll mga.drv第一讲[编程入门]这里我将给出一个小例子让大家熟悉用辅助库的编程结构:// GLOS.H//////////////////////////////////////////////////////////// This is an OS specific header file//判别操作系统的基本头文件#include <windows.h>// disable data conversion warnings#pragma warning(disable : 4244) // MIPS#pragma warning(disable : 4136) // X86#pragma warning(disable : 4051) // ALPHA////////////////////////////////////////////////////////// //opengl.cpp//主程序#include "glos.h"#include <GL/gl.h>#include <GL/glaux.h>#include "windows.h"void main(void){/*初始化:*/auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式auxInitPosition(0,0,500,500);//大小x=500 y=500 (0,0)是屏幕左上点auxInitWindow("sample1");//窗口初始化,参数是标题glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色//即背景色/*绘图*/glColor3f(1.0,0.0,0.0);//选颜色(R,G,B),参数0<x<1,这里就是红色glRectf(-0.5,-0.5,0.5,0.5);//画个方块glFlush();//强制绘图,不驻留缓存_sleep(1000);//windows函数,显示1秒(单位是毫秒)}//end of sample根据注释,应该看出程序功能:显示红色方块(2D)一秒钟。
C# 实例OpenGL是图形硬件的一个软件接口,是一种快速、高质量的3D图形软件。
它提供了近120个绘制点、线点多边形等3D图形的命令,可以完成绘制物体、变换、光照处理、着色、反走样、融合、雾化、位图和图像、纹理映射、动画等基本操作,通过把这一系列基本操作进行组合,可以构造更复杂的3D物体和描绘丰富多彩、千变万化的客观世界。
C#是以运行库为基础的一种编程语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果,如面向对象、类型安全等,并被寄希望成为微软发布的用于企业编写基于COM+和视窗系统的程序语言中的最好的一种[2]。
与C++相比,C#的语法更加简洁,调试更加容易,且应用程序开发更加快速。
把C#和OpenGL结合起来开发3D应用程序和软件,将显著提高开发效率。
在C#中,程序间的依赖项通过符号而不是文本来控制,因而不使用头文件,而且opengl32.dll以及opengl32.lib等文件也不能像在C++中那样进行部署和引用,所以,无法直接使用OpenGL所提供的图形库。
在C#中通过调用OpenGL 动态链接库文件:csgl.dll和csgl.native.dll实现OpenGL所提供的强大的图形功能。
这2个文件可以从网页上获取。
csgl.dll中定义了4个名称空间,即CsGL,CsGL.OpenGL,CsGL.Pointers,CsGL.Util,其中,CsGL.OpenGL定义的4个类OpenGL、GL、GLU、GLUT中封装了几乎所有的OpenGL函数、用户库函数、辅助库函数和实用库函数及常量;类OpenGLControl中定义了OpenGL场景绘制函数,如场景的初始化、场景的绘制函数等;类OpenGLContext中定义了OpenGL环境控制命令,如像素格式、调色板的创建等命令。
CsGL.Util定义了键盘、鼠标事件及异常处理等。
为了能够使用这2个文件,先将这2个文件拷贝到系统文件夹%systemroot%╲system32中,然后在项目的属性页对话框中将"引用路径"设置为系统文件夹%systemroot%╲system32,这样C#就可以找到运行/调试应用程序所需要的库文件。
下面是如何在VS2005环境下实现OpneGL建模C# 实例11、新建windows应用程序项目,将csgl.dll和csgl.native.dll两个文件拷贝到.....\bin\debug\文件夹中(可在/projects/csgl/files/下载),增加引用csgl.dll,新增类xzqOpenGLClass类。
2、xzqOpenGLClass.cs文件改为:using System;using System.Collections.Generic;using System.Text;using CsGL.OpenGL;//引用CsGL.OpenGL命名空间namespace OpenGL03{class xzqOpenGLClass : OpenGLControl{public double xzq_T, xzq_eyeX, xzq_eyeY, xzq_eyeZ;public xzqOpenGLClass(){}protected override void OnSizeChanged(EventArgs e){double aspect_ratio = (double)Size.Width / (double)Size.Height;GL.glViewport(0, 0, Size.Width, Size.Height);//视口大小GL.glMatrixMode(GL.GL_PROJECTION);GL.glLoadIdentity();GL.gluPerspective(10.0f, aspect_ratio, 0.1f, 100.0f);//等价与glFrustum,创建一个视景体GL.glMatrixMode(GL.GL_MODELVIEW);GL.glLoadIdentity();}/// <summary>/// OnPaint方法处理Paint事件/// </summary>/// <param name="pevent"></param>protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent){base.OnPaint(pevent);//ToDo:可加入自己的设计代码}/************************************************************************//* OpenGL初始化*//************************************************************************/protected override void InitGLContext(){base.InitGLContext();GL.glShadeModel(GL.GL_SMOOTH);GL.glClearColor(1.0f, 1.0f, 1.0f, 0.5f);GL.glClearDepth(1.0f);GL.glEnable(GL.GL_DEPTH_TEST);GL.glDepthFunc(GL.GL_LEQUAL);GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);double aspect_ratio = (double)Size.Width / (double)Size.Height;GL.glViewport(0, 0, Size.Width, Size.Height);//视口大小GL.glMatrixMode(GL.GL_PROJECTION);GL.glLoadIdentity();GL.gluPerspective(10.0f, aspect_ratio, 0.1f, 100.0f);//等价与glFrustum,创建一个视景体GL.glMatrixMode(GL.GL_MODELVIEW);GL.glLoadIdentity();}public override void glDraw(){GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存GL.glLoadIdentity();GLLight();//设置灯光GL.gluLookAt(xzq_eyeX, xzq_eyeY, xzq_eyeZ, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);//设置视图变换// GL.glColor3f(0.5f, 0.0f, 0.0f);//DrawSphere();DrawCylinder();//DrawCube();GL.glFlush(); // Flush The GL Pipeline}public void GLLight(){float[] ambient = { 1.0f, 1.0f, 0.0f, 1.0f };float[] diffuse = { 1.0f, 1.0f, 1.0f, 1.0f };float[] specular = { 1.0f, 1.0f, 1.0f, 1.0f };float[] position = { 1.0f, 1.0f, 1.0f, 0.0f };GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient);GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuse); GL.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, specular);GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position); GL.glEnable(GL.GL_LIGHT0); GL.glEnable(GL.GL_LIGHTING);}public void DrawCylinder(){GLUquadric hdc0 = GL.gluNewQuadric();GL.gluSphere(hdc0, 0.2, 38, 38);GL.gluDeleteQuadric(hdc0);GLUquadric hdc = GL.gluNewQuadric();GL.gluCylinder(hdc, 0.1, 0.1, 1.0, 16, 16);GL.gluDeleteQuadric(hdc);GL.glTranslatef(0.0f, 0.0f, 1.0f);GLUquadric hdc1 = GL.gluNewQuadric();GL.gluCylinder(hdc1, 0.2, 0.0, 0.4, 16, 16);GL.gluDeleteQuadric(hdc1);GL.glTranslatef(0.0f, 0.0f, -1.0f);GL.glRotatef(-90, 1.0f, 0.0f, 0.0f);GLUquadric hdc2 = GL.gluNewQuadric();GL.gluCylinder(hdc2, 0.1, 0.1, 1.0, 16, 16);GL.gluDeleteQuadric(hdc2);GL.glTranslatef(0.0f, 0.0f, 1.0f);GLUquadric hdc3 = GL.gluNewQuadric();GL.gluCylinder(hdc3, 0.2, 0.0, 0.4, 16, 16);GL.gluDeleteQuadric(hdc3);GL.glTranslatef(0.0f, 0.0f, -1.0f);GL.glRotatef(-90, 0.0f, 1.0f, 0.0f);GLUquadric hdc4 = GL.gluNewQuadric();GL.gluCylinder(hdc4, 0.1, 0.1, 1.0, 16, 16);GL.gluDeleteQuadric(hdc4);GL.glTranslatef(0.0f, 0.0f, 1.0f);GLUquadric hdc5 = GL.gluNewQuadric();GL.gluCylinder(hdc5, 0.2, 0.0, 0.4, 16, 16);GL.gluDeleteQuadric(hdc5);GL.glTranslatef(0.0f, -1.0f, 0.0f);}}}3、Form1.cs文件改为:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace OpenGL03{public partial class Form1 : Form{xzqOpenGLClass xzqGLView = new xzqOpenGLClass();public Form1(){InitializeComponent();this.ClientSize = new System.Drawing.Size(500, 500);xzqGLView.xzq_T = -0.0f;xzqGLView.xzq_eyeX = 20.0f;xzqGLView.xzq_eyeY = 20.0f;xzqGLView.xzq_eyeZ = 20.0f;xzqGLView.Parent = this;xzqGLView.BringToFront();xzqGLView.Dock = DockStyle.Fill;this.Controls.Add(xzqGLView);}}}4、编译运行效果C# 实例2开始的步骤基本上是一样的,只说正文了哈!1using System;2using System.Windows.Forms;3using System.Drawing;4using CsGL.OpenGL;5using CsGL.Util;67namespace TestOpenGL8 {9///<summary>10///11/// ** .NET(C#) 中使用 CsGL-OpenGL .NET** 12///13/// File: FirstOpenGL.cs14///15/// Author: 周振兴 (Zxjay 飘遥)16///17/// E-Mail: tda7264@18///19/// Date: 07-05-2320///21/// Blog: 22///23///</summary>24public class FirstOpenGl : Form25 {26///<summary>27/// FirstOpenGl 的构造方法28///</summary>29public FirstOpenGl()30 {31this.Text = "First OpenGL!";32this.MaximizeBox = false;33this.FormBorderStyle = FormBorderStyle.Fixed3D;34this.Size = new Size(400, 420);35 }3637///<summary>38///初始化 Bitmap39///</summary>40///<returns> Bitmap </returns>41private Bitmap InitBitMap()42 {43 Bitmap bmp = new Bitmap(400, 400);44 Graphics g = Graphics.FromImage(bmp);45 GDIGLContext gdictxt = new GDIGLContext(g);4647 gdictxt.Create(new DisplayType(DisplayFlags.DRAW_TO_B ITMAP, true), null);48 gdictxt.Grab();4950 GLTest gl = new GLTest();51 gl.Init();52 gl.Draw();53 GL.glFinish();5455 gdictxt.Dispose();56 g.Dispose();5758return bmp;59 }6061///<summary>62///重写 Form 的 OnPaint 方法,在其上绘制位图63///</summary>64///<param name="e"></param>65protected override void OnPaint(PaintEventArgs e)66 {67 Graphics g = e.Graphics;68 g.DrawImage(InitBitMap(), new Rectangle(0, 0, 400, 40 0));69base.OnPaint(e);70 }7172///<summary>73///程序的入口74///</summary>75public static void Main()76 {77 FirstOpenGl fog = new FirstOpenGl();78 Application.Run(fog);79 }80 }818283///<summary>84///继承自 System.Object/OSLib/OpenGL/OpenGL_Extension/GLU/GL UT/GL85///</summary>86public class GLTest : GL87 {88public void Init()89 {90 glMatrixMode(GL_PROJECTION);91 gluOrtho2D(-10.0, 10.0, -10.0, 10.0);92 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);93 glColor3f(1.0f, 0, 0);94 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);95 glClear(GL_COLOR_BUFFER_BIT);96 glShadeModel(GL_SMOOTH);97 }9899///<summary>100///绘制位图101///</summary>102public void Draw()103 {104const int NUMBER = 12;105const int RADIUS = 8;106double PI = 3.1415;107 PointF[] pt = new PointF[NUMBER];108109for (int i = 0; i < NUMBER; i++)110 {111 pt[i].X = (float)(RADIUS * Math.Cos(PI / NUMBER + 2 * PI * i / NUMBER));112 pt[i].Y = (float)(RADIUS * Math.Sin(PI / NUMBER + 2 * PI * i / NUMBER));113 }114115for (int i = 0; i < NUMBER; i++)116for (int j = i + 1; j < NUMBER; j++)117 {118 glBegin(GL_LINES);119 glVertex2f(pt[i].X, pt[i].Y);120 glVertex2f(pt[j].X, pt[j].Y);121 glEnd();122 }123 glFlush();124 }。