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)一秒钟。
OpenGL进⾏简单的通⽤计算实例博主作为OpenGL新⼿,最近要⽤OpenGL进⾏并⾏的数据计算,突然发现这样的资料还是很少的,⼤部分资料和参考书都是讲⽤OpenGL进⾏渲染的。
好不容易找到⼀本书《GPGPU编程技术,从OpenGL、CUDA到OpenCL》,⾥⾯对并⾏处理的发展进⾏了系统性的介绍,还是很不错的。
⼩⽩博主很兴奋,看完书中第三章后恍然⼤悟了很多,就贴出书中代码3-3的例⼦,实现⼀番,并⽤⼀副图⽚数据做了实现。
实现环境:Window7 32bit, VS2013+OpenGL3.3+GLEW+GLFW。
OpenGL⽤来进⾏通⽤数据计算的流程如下图,数据从CPU(应⽤程序)中通过“⽤绘制来调⽤”发送到纹理缓存,以纹理映射的⽅式给到着⾊器,最后经过⽚段着⾊器的计算(GLSL语⾔)后,再将结果输出到纹理缓存,最后CPU(应⽤程序)再从纹理缓存中读取结果数据,⾄此计算完成。
1.书中代码3-3,输⼊⼀组数据到纹理缓存,然后再从纹理缓存中读取这组数据,代码以及实验结果如下:数据类型就设置为float,将数据发送⾄纹理缓存要⽤这个函数glTexSubImage2D( );#include <iostream>#include <stdlib.h>#include <stdio.h>#define GLEW_STATIC#include <GL/glew.h>#include <GLFW/glfw3.h>using namespace std;#define WIDTH 2#define HEIGHT 3int main(int argc, char** argv){int nWidth=(int)WIDTH;int nHeight=(int)HEIGHT;int nSize=(int)nWidth*nHeight;//创建输⼊数据float* pfInput=new float[4*nSize];float* pfOutput=new float[4*nSize];for (int i=0; i<nSize*4; i++){pfInput[i]= (float)(i + 1.2345);}//初始化并设置GLFWglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//创建GLFW窗⼝GLFWwindow* window = glfwCreateWindow(3, 2, "LearnOpenGL", nullptr, nullptr);glfwMakeContextCurrent(window);//初始化GLEW//glewExperimental = GL_TRUE;glewInit();//创建FBO并绑定GLuint fb;glGenFramebuffersEXT(1, &fb);glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);//创建纹理对象并绑定GLuint tex;glGenTextures(1, &tex);glBindTexture(GL_TEXTURE_2D, tex);//设置纹理参数glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);//将纹理关联到FBOglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0); //将纹理数据设置为单精度浮点数glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, nWidth, nHeight,0, GL_RGBA, GL_FLOAT, NULL);//将数据传⾄输⼊纹理缓存//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_FLOAT, pfInput);glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, nWidth, nHeight, GL_RGBA, GL_FLOAT, pfInput);//从输出纹理缓存中读出数据glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);glReadPixels(0,0, nWidth, nHeight, GL_RGBA, GL_FLOAT, pfOutput);//打印并检查结果bool bCap=true;for (int i=0; i<nSize*4; i++){cout<<i<<":\t"<<pfInput[i]<<'\t'<<pfOutput[i]<<endl;if (pfInput[i]!=pfOutput[i]) bCap=false;}if (bCap) cout<<"Round trip complete!"<<endl;else cout<<"Round trip failed!" <<endl;delete pfInput;delete pfOutput;glDeleteFramebuffers(1, &fb);glDeleteTextures(1, &tex);system("pause");return0;}View Code2.读取⼀幅图像,写⼊纹理缓存并从纹理缓存读出,配合OpenCV使⽤。
先编译运行一个简单的例子,这样我们可以有一个直观的印象。
从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。
除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序。
例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。
图一:一个彩色的三角形首先创建工程,其步骤如下:1)创建一个Win32 Console Application。
2)链接OpenGL libraries。
在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE改为__WINDOWS。
最后单击OK。
现在你可以把下面的例子拷贝到工程中去,编译运行。
你可以看到一个彩色的三角形。
我们先看看main函数。
函数中以glut开头的函数都包含在glut.h中。
GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。
·glutInit用来初始化GLUT库并同窗口系统对话协商。
·glutInitDisplayMode用来确定所创建窗口的显示模式。
本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。
参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。
·glutInitWindowSize初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。
·glutInitWindowPosition设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
概述高性能图形算法行业标准OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。
OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。
在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。
IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。
OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。
虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。
OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。
因此,支持OpenGL 的软件具有很好的移植性,可以获得非常广泛的应用。
由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。
但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。
在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。
opengl使用手册简书【实用版】目录一、OpenGL 简介二、OpenGL 函数库1.核心函数库2.矩阵操作、几何变换和投影变换函数3.扩展库 GLEW三、OpenGL 菜单的使用1.交互式输入设备的处理2.glut 命令与鼠标函数四、总结正文一、OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。
它被广泛应用于游戏开发、计算机辅助设计、虚拟现实等领域。
OpenGL 提供了丰富的函数库,可以实现各种复杂的图形效果。
二、OpenGL 函数库OpenGL 的函数库主要可以分为核心函数库和扩展库。
核心函数库包含了基本的绘图功能,如绘制几何图元、矩阵操作、几何变换和投影变换等。
扩展库 GLEW(GLEW Extension Wrangler Library)则提供了更多的高级功能,如阴影、纹理贴图等。
1.核心函数库核心函数库包含了许多常用的绘图函数,如:- glBegin():开始绘制- glEnd():结束绘制- glVertex():绘制一个顶点- glColor():设置颜色2.矩阵操作、几何变换和投影变换函数OpenGL 提供了丰富的矩阵操作、几何变换和投影变换函数,如:- glPushMatrix():矩阵入栈- glPopMatrix():矩阵出栈- glTranslate():几何变换(平移)- glRotate():几何变换(旋转)- glScale():几何变换(缩放)- gluPerspective():投影变换3.扩展库 GLEWGLEW 是一个方便的扩展库,可以方便地管理 OpenGL 扩展。
它提供了一系列的函数,如:- glewInit():初始化 GLEW- glewGetError():获取 GLEW 错误- glewCreateContext():创建 OpenGL 上下文- glewMakeCurrent():设置当前 OpenGL 上下文三、OpenGL 菜单的使用OpenGL 支持交互式输入设备,如鼠标和键盘。
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 }。