【C# / OpenGL】将OpenGL的坐标系转换为普通屏幕坐标系处理的方法(基于CSGL)

    在用OpenGL编写2D游戏或者其他图形程序时,很多人应该和我一样习惯于Windows的屏幕坐标系风格了(即左上角为 (0,0),右下角为 (屏幕宽度,屏幕高度))。在传统的GDI图形程序中,以及常规的Windows程序的界面控件布局,都是基于这样的坐标系。

    在OpenGL中,坐标是基于浮点的,坐标一般的取值范围为(-1.0,1.0), 原点坐标(0,0)位于屏幕的正中心,对于习惯了传统Windows编程的人来说,要转换到OpenGL的坐标使用中会有一段比较痛苦的适应过程。

    我找到了一个比较折中的办法,通过封装一个绘图函数,可以通过传统WIndows屏幕坐标系来调用OpenGL的绘图功能。


初始化代码:

//设置视口
        GL.gluOrtho2D(0.0,ScreenWidth, <span style="font-family: Arial, Helvetica, sans-serif;">ScreenHeight</span>.0,);
通过设置视口,将OpenGL的显示区域坐标范围调整到窗口或者屏幕的宽度,高度。


绘图代码:

/// <summary>
        /// 绘制纹理
        /// </summary>
        /// <param name="texture">纹理ID</param>
        /// <param name="x">起点x</param>
        /// <param name="y">起点y</param>
        /// <param name="width">宽度</param>
        /// <param name="height">高度</param>
        public static void DrawImage(uint[] texture, float x, float y, float width, float height)
        {
            // 绑定纹理
            GL.glBindTexture(GL.GL_TEXTURE_2D, texture[0]);
            GL.glBegin(GL.GL_QUADS);
            {
                // 纹理坐标映射
                GL.glTexCoord2f(0.0f, 1.0f); GL.glVertex2f(x, y);
<pre class="csharp" name="code"><span style="white-space:pre">		</span>GL.glTexCoord2f(0.0f, 0.0f); GL.glVertex2f(x, y + height);
GL.glTexCoord2f(1.0f, 0.0f); GL.glVertex2f(x + width, y + height);
 
<span style="white-space:pre"></span><pre class="csharp" name="code"><span style="white-space:pre">		</span>GL.glTexCoord2f(1.0f, 1.0f); GL.glVertex2f(x + width, y);<span style="font-family: Arial, Helvetica, sans-serif;">         </span>
} GL.glEnd(); }
 


DrawImage函数调用时,参数与GDI的DrawImage函数一致,只是第一个图像参数换成了OpenGL所需要的纹理ID,后面即为绘制矩形的坐标参数。


这样做虽然可能会有诸多缺陷,也不是OpenGL的正确使用方法,但是不失为一个折中而又带来便利的临时解决方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ls9512

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

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

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

打赏作者

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

抵扣说明:

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

余额充值