老师布置的作业,在vs2008下,用c#语言,opengl技术画一面五星红旗,求高手帮忙啊

老师布置的作业,在vs2008下,用c#语言,opengl技术画一面五星红旗,求高手帮忙啊,第1张

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemDrawing;

using SystemData;

using SystemLinq;

using SystemText;

using SystemWindowsForms;

using CsGLOpenGL;

namespace mySecondExample

{

public partial class OGLview : OpenGLControl

{

public OGLview()

{

InitializeComponent();

}

protected override void InitGLContext()

{

baseInitGLContext();

GLglClearColor(10f, 00f, 00f, 00f); // 设置OpenGl视图空间的背景色为黑色

GLglClear(GLGL_COLOR_BUFFER_BIT | GLGL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer

GLglMatrixMode(GLGL_PROJECTION); // 将变换矩阵模式设为投影变换

GLglLoadIdentity(); // 加载投影变换单位矩阵重置视景体

// 用正射投影设置一个边长为20个单位的立方体兴视景体

GLglOrtho(-10, 10, -1, 10, 0, 20);

//TODO: 可添加其他初始化动作

}

protected override void OnSizeChanged(EventArgs e)

{

try

{

baseOnSizeChanged(e);

}

catch (Exception)

{

}

// 设置视口尺寸与视图类控件的尺寸相同

GLglViewport(0, 0, thisSizeWidth, thisSizeHeight);

GLglMatrixMode(GLGL_MODELVIEW); // 设置当前为模型视图矩阵

GLglLoadIdentity(); // 重置模型视图矩阵

}

public override void glDraw()

{

GLglClearColor(10f, 00f, 00f, 00f); // 设置OpenGl视图空间的背景色为黑色

GLglClear(GLGL_COLOR_BUFFER_BIT | GLGL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer

GLglColor3f(10f, 1f, 00f);

/ draw two redish triangles - at upper-right corner /

GLglBegin(GLGL_TRIANGLES);

GLglVertex2f(0f, 01f);

GLglVertex2f(-0035f, 005f);

GLglVertex2f(0035f, 005f);

GLglVertex2f(0035f, 005f);

GLglVertex2f(-01f, 005f);

GLglVertex2f(-005f, 0f);

GLglVertex2f(0035f, 005f);

GLglVertex2f(-005f, 0f);

GLglVertex2f(005f, 0f);

GLglVertex2f(005f, 0f);

GLglVertex2f(0035f, 005f);

GLglVertex2f(01f, 005f);

GLglVertex2f(005f, 0f);

GLglVertex2f(007f, -007f);

GLglVertex2f(0f, -00f);

GLglVertex2f(-005f, 0f);

GLglVertex2f(-007f, -007f);

GLglVertex2f(0f, 0f);

GLglEnd();

}

}

}

这是一个五角星 你可以运行试一下

如果合适 那就采纳把 记得分儿~

一、搭建开发环境

1 打开Xcode, 新建一个工程

选择:IOS -> Application -> Single View Application模板

输入工程名称和基本信息,勾选“UseStoryboards”,然后创建

2 添加必要的框架

在“Build Phases”中,添加三个框架

3 修改viewController。h

添加 “#import”,并将它修改为继承"GLKViewController"

4 修改“view”的类

双击“MainStoryboardstoryboard”展开,选择"view"

然后,在“Identity Inspector"中,将它的类改为”GLKView“

好了,OpenGL的环境基本上搭建出来了。

二、增加自己代码

基本上,所有的代码都是加到ViewControllerm文件中

1、添加全局属性声明

@interface ViewController ()@property(strong,nonatomic)EAGLContext

context;@property(strong,nonatomic)GLKBaseEffect effect;@end@implementation

ViewController@synthesize context, effect;

2、 添加一组顶点数据

这是一个正方形顶点数组。实际上它是二个三角形接合而成的

GLfloat squareVertexData[48] ={ 05f, 05f, -09f, 00f, 00f, 10f, 10f,

10f, -05f, 05f, -09f, 00f, 00f, 10f, 10f, 10f, 05f, -05f, -09f,

00f, 00f, 10f, 10f, 10f, 05f, -05f, -09f, 00f, 00f, 10f, 10f, 10f,

-05f, 05f, -09f, 00f, 00f, 10f, 10f, 10f, -05f, -05f, -09f, 00f,

00f, 10f, 10f, 10f,};

每行顶点数据的排列含义是:

顶点X、顶点Y,顶点Z、法线X、法线Y、法线Z、纹理S、纹理T。

在后面解析此数组时,将参考此规则。

顶点位置用于确定在什么地方显示,法线用于光照模型计算,纹理则用在贴图中。

一般约定为“顶点以逆时针次序出现在屏幕上的面”为“正面”。

世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。

三、初始化OpenGL环境

1、 基本的初始化代码

在ViewControllerm中有个函数(void)viewDidLoad,它是程序运行时,初始化回调函数。在viewDidLoad函数内补充我们自己的初始化代码。

// 使用“ES2”创建一个“EAGLEContext”实例 selfcontext = [[[EAGLContext

alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]autorelease]; //

将“view”的context设置为这个“EAGLContext”实例的引用。并且设置颜色格式和深度格式。 GLKView view =

(GLKView)selfview; viewcontext = selfcontext; viewdrawableColorFormat =

GLKViewDrawableColorFormatRGBA8888; viewdrawableDepthFormat =

GLKViewDrawableDepthFormat24; //

将此“EAGLContext”实例设置为OpenGL的“当前激活”的“Context”。这样,以后所有“GL”的指令均作用在这个“Context”上。随后,发送第一个“GL”指令:激活“深度检测”。

[EAGLContext setCurrentContext:context]; glEnable(GL_DEPTH_TEST); //

创建一个GLK内置的“着色效果”,并给它提供一个光源,光的颜色为绿色。 selfeffect = [[[GLKBaseEffect

alloc]init]autorelease]; selfeffectlight0enabled = GL_TRUE;

selfeffectlight0diffuseColor = GLKVector4Make(00f, 10f, 00f, 10f);

2、 运行。现在应该是粉红色屏幕了(目前场景仍是空的),说明初始化过程没问题

四、 将项点数据写入能用的顶点属性存储区

1、 写入过程

首先将数据保存进GUP的一个缓冲区中,然后再按一定规则,将数据取出,复制到各个通用顶点属性中。

注:如果顶点数据只有一种类型(如单纯的位置坐标),换言之,在读数据时,不需要确定第一个数据的内存位置(总是从0开始),则不必事先保存进缓冲区。

2、 顶点数组保存进缓冲区

//

声明一个缓冲区的标识(GLuint类型)让OpenGL自动分配一个缓冲区并且返回这个标识的值绑定这个缓冲区到当前“Context”最后,将我们前面预先定义的顶点数据“squareVertexData”复制进这个缓冲区中。

// 注:参数“GL_STATIC_DRAW”,它表示此缓冲区内容只能被修改一次,但可以无限次读取。 GLuint buffer;

glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData,

GL_STATIC_DRAW);

3、将缓冲区的数据复制进能用顶点属性中

glEnableVertexAttribArray(GLKVertexAttribPosition);

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 48,

(char)NULL + 0);

首先,激活顶点属性(默认它的关闭的)。“GLKVertexAttribPosition”是顶点属性集中“位置Position”属性的索引。

顶点属性集中包含五种属性:位置、法线、颜色、纹理0,纹理1。

它们的索引值是0到4。

激活后,接下来使用“glVertexAttribPointer”方法填充数据。

以上就是关于老师布置的作业,在vs2008下,用c#语言,opengl技术画一面五星红旗,求高手帮忙啊全部的内容,包括:老师布置的作业,在vs2008下,用c#语言,opengl技术画一面五星红旗,求高手帮忙啊、怎么在ios开发中使用opengl、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9704002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存