C#中使用OpenGL:(四)C#版的OpenGL常量

13 篇文章 16 订阅

在使用OpenGL时,经常会用到一些常量,诸如GL_FALSE、GL_BUFFER_BITS之类的。这些常量,在C/C++中,都是在头文件中用宏来声明,编译器在编译时,会把宏替换成实际的数值。C#不能像C/C++那样通过使用#define来定义宏,那么在C#中如何封装OpenGL几千个常量呢?方法主要有两种,一是用枚举类型(enum)封装,常量都是枚举类型变量的成员;二是用类(class)封装,常量都是类的属性或字段。
OpenGL常量绝大部分是uint类型的,也有i少数是int、bool和long long类型的。枚举类型要求各成员的类型必须一致,因此不适宜使用枚举类型来封装。本项目用类类来封装OpenGL常量。
考虑到OpenGL常量都是以“GL”开头,为了在形式上跟C版的常量名称相近,姑且声明一个公有的类GL,用来封装常量,常量作为类“GL”中的属性而存在,为了使常量名更简短,把常量前面的“GL_”去掉,如果遇到像GL_2D这类常量,则仅去掉“GL”。
比如:

public class GL
{
	public const uint BUFFER_BIT=0X00000012;
	public const bool TRUE=true;
	public const uint _2D=0x00000056;
}

按照这种方法,对于C/C++中的宏定义#define GL_FALSE 0,在C#被转变为public const bool FALSE=false,引用时可以这样:GL.FALSE
C# OpenGL接口源码、C# OpenGL编程例子可在百度网盘下载:链接:https://pan.baidu.com/s/1dnIo1s-l6aqlE3IgaMJA5g 
提取码:wc0x

如何获取OpenGL常量?

OpenGL中的常量都可以在OpenGL库的头文件中找到。在官方的glew库中,打开glew.h可以看到这些常量以如下的形式定义:

这里写图片描述

好了,既然已经找到OpenGL常量,那么下一步就是在C#中定义这些常量。先在C#中新建一个类,类的名称为GL,然后在类中将这些常量定义为常量属性。

在这里插入图片描述
可是问题又来了,OpenGL有很多常量,如果一个一个地敲进去,既耗费大量的时间,又很容易出错。这时,通过观察glew.h这个头文件,可以发现,所有的常量都是宏定义,以#define开头,后边紧跟宏名称,最后是常量本尊。一个宏定义独占一行,如此有规律的文件,完全可以写个程序,把glew.h 中的常量读出来,并转变为“public const uint ### ”形式的字符串,然后保存到一个txt文件中。
本着能偷懒,绝不勤快的指导方针,我花了不到半个小时写了一段几十行的C程序,程序如下:
这里写图片描述

运行程序,不到一秒钟,所有的变量定义完毕!我统计了一下,将近有6000个常量。天啊,如果一个一个地往C#里敲,没有两三天恐怕事干不完的吧。程序自动生成的代码如下:

这里写图片描述

我原本以为,这是一个艰巨的任务。在使用程序自动生成代码之后,前前后后总共花了不到一个小时,就把将近6000个常量往C#中输入完毕,非常完美,一点错误都没有。看来时刻准备偷懒,也能逼出一点捷径来。想了解详细的设计,可以浏览我的源码

结语

前面写了好几篇文章,题目都叫“C#中使用OpenGL”,实际上都是前奏,还没有介绍如何将C/C++版本的OpenGL改写为C#版本的。这篇文章,算是正式开始。这是“C#中使用OpenGL”的第一步,那就是如何解决OpenGL常量在C#中的表示问题。下一步工作就是研究如何在C#中声明OpenGL的函数。

上一篇:C#中使用OpenGL:(三)将.lib文件编译为.dll文件
下一篇:C#中使用OpenGL:(五)1.1版本的OpenGL函数

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shifenglv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值