OpenGL 2D模式
//
// left top 这里设置的默认是左上角
//
void push_view2d(int left, int top, int width, int height)
{
//glPushAttrib(GL_TRANSFORM_BIT|GL_VIEWPORT_BIT);
glPushAttrib(GL_ALL_ATTRIB_BITS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity(); //直角坐标系
//glOrtho(left, width, top, height, 0, INT_MAX);
//十字坐标系
//glOrtho(-width/2, width/2, -height/2, height/2, 0, INT_MAX);// //windows坐标系
//glOrtho(left, width, height, top, -1.0, 1000000.0);
//这里的-1要去掉,不然绘制会有舍入偏差
//glOrtho(left, left+width-1, top+height-1, top, 0, INT_MAX);
glOrtho(left, left+width, top+height, top, , INT_MAX); //glOrtho(0, width-1, -height+1, 0, 0, INT_MAX);
//glTranslatef(0, -height+1, 0); //重新设置正面,默认GL_CCW
//glFrontFace(GL_CW); //反转屏幕
//glScalef(1.0f, -1.0f, 1.0f);
//glTranslatef(0.0f, -height, 0.0f); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);//关闭深度测试
glDisable(GL_CULL_FACE); //关闭面剔除
} //恢复视口映射设置
void pop_view2d()
{
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopAttrib();
}
函数使用方法:
glClear(...);//清屏
//先设置成800x600
//这是虚拟的屏幕尺寸。要真实的分辨率,就要和你的glViewport设置的尺寸一样
push_view2d(0, 0, 800, 600);
draw(...);
pop_view2d();
//再设置成1024x768模式,绘制一些东西
push_view2d(0, 0, 1024, 768);
draw(...);
pop_view2d();
swapbuffers();//反转缓存,显示
特别需要说明的是,OpenGL默认的起始左边在左下角,这样映射成Windows坐标之后,绘制出来的纹理是上下颠倒的。解决办法有两个,一个是绘制的时候交换一下v1、v2的坐标,另外就是制作纹理的时候,上下颠倒一下。
#define CGL_LOWER_LEFT 0 //左下角起始(默认)
#define CGL_UPPER_LEFT 1 //左上角起始(Windows)
#define CGL_COORDINATE CGL_LOWER_LEFT //定义左上角起始 /*
struct vec4f
{
float r, g, b, a;
};
struct vertex_type
{
float x, y, z;
float u, v;
vec4f color;
};
*/ void glcontext::draw_image(GLuint image, float x, float y, float width, float height,
float u1, float v1, float u2, float v2)
{
vertex_type vtx[] = {
#if CGL_COORDINATE == CGL_LOWER_LEFT//左下角为原点
vertex_type(x, y, 0.0f, u1, v2, color),
vertex_type(x + width, y, 0.0f, u2, v2, color),
vertex_type(x + width, y + height, 0.0f, u2, v1, color),
vertex_type(x , y + height, 0.0f, u1, v1, color)
#else//右下角为原点,OpenGL默认
vertex_type(x, y, 0.0f, u1, v1, color),
vertex_type(x + width, y, 0.0f, u2, v1, color),
vertex_type(x + width, y + height, 0.0f, u2, v2, color),
vertex_type(x, y + height, 0.0f, u1, v2, color)
#endif
};
this->bind_texture(image);
this->draw_arrays(GL_TRIANGLE_FAN, vtx, , );
}
OpenGL 2D模式的更多相关文章
- 一个H5的3D滑动组件实现(兼容2D模式)
起由 原始需求来源于一个项目的某个功能,要求实现3D图片轮播效果,而已有的组件大多是普通的2D图片轮播,于是重新造了一个轮子,实现了一个既支持2D,又支持3D的滑动.轮播组件. 实现思路 刚一开始肯定 ...
- 深入理解OpenGL拾取模式(OpenGL Picking)
深入理解OpenGL拾取模式(OpenGL Picking) 本文转自:http://blog.csdn.net/zhangci226/article/details/4749526 在用OpenGL ...
- Unity3D学习笔记(十二):2D模式和异步资源加载
2D模式和3D模式区别:背景纯色,摄像机2D,没有深度轴 精灵图片设置 Normal map,法线贴图,更有立体感 Sprite (2D and UI),2D精灵贴图,有两种用途 1.当做UI贴图 2 ...
- 基于OpenGL编写一个简易的2D渲染框架-04 绘制图片
阅读文章前需要了解的知识,纹理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 过程简述:利用 FreeI ...
- 基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader
Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ...
- NeHe OpenGL教程 第三十二课:拾取游戏
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Unity 4.3 2D 教程:新手上路
这篇文章译自 Christopher LaPollo 先生的 Unity 4.3 2D 教程的第一部分 Unity 4.3 2D Tutorial: Getting Started 感谢这套优秀教程的 ...
- Unity 2D入门基础教程之僵尸先生
注:这是根据网上教程完成的. 翻译:http://blog.1vr.cn/?p=1422 原文:http://www.raywenderlich.com/61532/unity-2d-tutorial ...
- OpenCL、OpenGL、OpenAL
一:OpenCL (全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器 ...
随机推荐
- xtu Shortest Path
Acceteped : 23 Submit : 61 Time Limit : 5000 MS Memory Limit : 65536 KB Description 题目描述 N(3≤N≤1 ...
- Python中表示中文的pattern
Python中表示中文的pattern:[\u4e00-\u9fff] 汉字unicode码表: http://jlqzs.blog.163.com/blog/static/2125298320070 ...
- HDU 4745 最长回文子序列
题目大意 两只青蛙朝不同方向条,每次都到达值相同的位置,不能重复到达自己到过的地方,且不能飞跃已到过的地方 我们可以理解为这两只青蛙分别把整个序列遍历了一遍,依次走过所有的点,找到最多相同的点的个数, ...
- [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)
传送门 至少BZOJ过了,其他的直接弃. 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的 ...
- [SCOI2008]奖励关 - 状压动规 - 概率与期望
Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝 ...
- Linux下汇编语言学习笔记67 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- ****Call to a member function item() on a non-object
A PHP Error was encountered Severity: Error Message: Call to a member function item() on a non-objec ...
- [bzoj3527][Zjoi2014]力_FFT
力 bzoj-3527 Zjoi-2014 题目大意:给定长度为$n$的$q$序列,定义$F_i=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\lim ...
- Ubuntu 16.04安装***-qt5
上一篇文章http://www.cnblogs.com/EasonJim/p/7133097.html中,第5步安装本地代理源服务器使用的是electron-ssr,发觉这个东西难配且难用,非常不建议 ...
- anaconda是个啥?
Anaconda具有跨平台(win/mac/linux).包管理(类似于pip).环境管理(类似于virtualenv)的特点,因此很适合快速在新的机器上部署Python环境 Anaconda利用工具 ...