OpenGL3-绘制各种图元绘制
#include "CELLWinApp.hpp"
#include <gl/GLU.h>
#include <assert.h>
#include <math.h>
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
/**
* 该例子展示如何点,线,面等数据,
* 主要用到的OpenGL函数及定义如下
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
GL_QUAD_STRIP
GL_POLYGON
绘制函数:改函数是OpenGL系统定义的函数,一些基本的绘制可以使用,效率较高
缺点是如果顶点数据不可随意组合:
参数有以下:相信有经验的大牛们,一看就知道是啥了,但对新手,我还是做个简单的介绍
T = texture coord :纹理坐标,四维
C = 颜色
N = 法线
V = 定点
V = vertex
2 = 元素的个数
F = 数据的格式: float
GL_V2F //! 数据是两个float,
GL_V3F //! 数据是三个个float
C = COLOR
4ub= 4个(r,g,b,a unsigned byte)
V = vertex
2f = 2 * float
GL_C4UB_V2F
GL_C4UB_V3F
GL_C3F_V3F
GL_N3F_V3F
GL_C4F_N3F_V3F
GL_T2F_V3F
GL_T4F_V4F
GL_T2F_C4UB_V3F
GL_T2F_C3F_V3F
GL_T2F_N3F_V3F
GL_T2F_C4F_N3F_V3F
GL_T4F_C4F_N3F_V4F
glInterleavedArrays( );
glDrawArrays( );
gluPerspective,以及如何自己生成一个矩阵,替代gluPerspective函数
同时加入键盘事件的处理,通过按'S'键切换绘制图元的类型
为了在应用层中回去键盘事件,需要对之前的基类做再次改造
将event函数声明成为虚函数,这样应用层可以进行重写。
如果你对Windows事件消息不熟悉,那你要看书了
*
*/
/**
* 顶点结构声明
*/
struct Vertex
{
unsigned char r, g, b, a;
float x, y, z;
};
Vertex g_points[] =
{
{ 255, 0, 0, 255, 0.0f, 0.0f, 0.0f },
{ 0, 255, 0, 255, 0.5f, 0.0f, 0.0f },
{ 0, 0, 255, 255, -0.5f, 0.0f, 0.0f },
{ 255, 255, 0, 255, 0.0f,-0.5f, 0.0f },
{ 255, 0, 255, 255, 0.0f, 0.5f, 0.0f }
};
Vertex g_lines[] =
{
{ 255, 0, 0, 255, -1.0f, 0.0f, 0.0f }, // Line #1
{ 255, 0, 0, 255, 0.0f, 1.0f, 0.0f },
{ 0, 255, 0, 255, 0.5f, 1.0f, 0.0f }, // Line #2
{ 0, 255, 0, 255, 0.5f,-1.0f, 0.0f },
{ 0, 0, 255, 255, 1.0f, -0.5f, 0.0f }, // Line #3
{ 0, 0, 255, 255, -1.0f, -0.5f, 0.0f }
};
Vertex g_lineStrip_and_lineLoop[] =
{
{ 255, 0, 0, 255, 0.5f, 0.5f, 0.0f },
{ 0, 255, 0, 255, 1.0f, 0.0f, 0.0f },
{ 0, 0, 255, 255, 0.0f,-1.0f, 0.0f },
{ 255, 255, 0, 255, -1.0f, 0.0f, 0.0f },
{ 255, 0, 0, 255, 0.0f, 0.0f, 0.0f },
{ 255, 0, 255, 255, 0.0f, 1.0f, 0.0f }
};
Vertex g_triangles[] =
{
{ 255, 0, 0, 255, -1.0f, 0.0f, 0.0f }, // Triangle #1
{ 0, 0, 255, 255, 1.0f, 0.0f, 0.0f },
{ 0, 255, 0, 255, 0.0f, 1.0f, 0.0f },
{ 255, 255, 0, 255, -0.5f,-1.0f, 0.0f }, // Triangle #2
{ 255, 0, 0, 255, 0.5f,-1.0f, 0.0f },
{ 0, 255, 255, 255, 0.0f,-0.5f, 0.0f }
};
Vertex g_triangleStrip[] =
{
{ 255, 0, 0, 255, -2.0f, 0.0f, 0.0f },
{ 0, 0, 255, 255, -1.0f, 0.0f, 0.0f },
{ 0, 255, 0, 255, -1.0f, 1.0f, 0.0f },
{ 255, 0, 255, 255, 0.0f, 0.0f, 0.0f },
{ 255, 255, 0, 255, 0.0f, 1.0f, 0.0f },
{ 255, 0, 0, 255, 1.0f, 0.0f, 0.0f },
{ 0, 255, 255, 255, 1.0f, 1.0f, 0.0f },
{ 0, 255, 0, 255, 2.0f, 1.0f, 0.0f }
};
Vertex g_triangleFan[] =
{
{ 255, 0, 0, 255, 0.0f,-1.0f, 0.0f },
{ 0, 255, 255, 255, 1.0f, 0.0f, 0.0f },
{ 255, 0, 255, 255, 0.5f, 0.5f, 0.0f },
{ 255, 255, 0, 255, 0.0f, 1.0f, 0.0f },
{ 0, 0, 255, 255, -0.5f, 0.5f, 0.0f },
{ 0, 255, 0, 255, -1.0f, 0.0f, 0.0f }
};
Vertex g_quads[] =
{
{ 255, 0, 0, 255, -0.5f,-0.5f, 0.0f }, // Quad #1
{ 0, 255, 0, 255, 0.5f,-0.5f, 0.0f },
{ 0, 0, 255, 255, 0.5f, 0.5f, 0.0f },
{ 255, 255, 0, 255, -0.5f, 0.5f, 0.0f },
{ 255, 0, 255, 255, -1.5f, -1.0f, 0.0f }, // Quad #2
{ 0, 255, 255, 255, -1.0f, -1.0f, 0.0f },
{ 255, 0, 0, 255, -1.0f, 1.5f, 0.0f },
{ 0, 255, 0, 255, -1.5f, 1.5f, 0.0f },
{ 0, 0, 255, 255, 1.0f, -0.2f, 0.0f }, // Quad #3
{ 255, 255, 0, 255, 2.0f, -0.2f, 0.0f },
{ 0, 255, 255, 255, 2.0f, 0.2f, 0.0f },
{ 255, 0, 255, 255, 1.0f, 0.2f, 0.0f }
};
Vertex g_quadStrip[] =
{
{ 255, 0, 0, 255, -0.5f,-1.5f, 0.0f },
{ 0, 255, 0, 255, 0.5f,-1.5f, 0.0f },
{ 0, 0, 255, 255, -0.2f,-0.5f, 0.0f },
{ 255, 255, 0, 255, 0.2f,-0.5f, 0.0f },
{ 255, 0, 255, 255, -0.5f, 0.5f, 0.0f },
{ 0, 255, 255, 255, 0.5f, 0.5f, 0.0f },
{ 255, 0, 0, 255, -0.4f, 1.5f, 0.0f },
{ 0, 255, 0, 255, 0.4f, 1.5f, 0.0f },
};
Vertex g_polygon[] =
{
{ 255, 0, 0, 255, -0.3f,-1.5f, 0.0f },
{ 0, 255, 0, 255, 0.3f,-1.5f, 0.0f },
{ 0, 0, 255, 255, 0.5f, 0.5f, 0.0f },
{ 255, 255, 0, 255, 0.0f, 1.5f, 0.0f },
{ 255, 0, 255, 255, -0.5f, 0.5f, 0.0f }
};
class Tutorial2 :public CELL::Graphy::CELLWinApp
{
public:
Tutorial2(HINSTANCE hInstance)
:CELL::Graphy::CELLWinApp(hInstance)
,_primitiveType(GL_POINTS)
{
}
virtual void render()
{
do
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
/**
* 指明,要操作的矩阵是模型矩阵
*/
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -5.0f );
switch( _primitiveType )
{
case GL_POINTS:
glInterleavedArrays( GL_C4UB_V3F, 0, g_points );
glDrawArrays( GL_POINTS, 0, 5 );
break;
case GL_LINES:
glInterleavedArrays( GL_C4UB_V3F, 0, g_lines );
glDrawArrays( GL_LINES, 0, 6 );
break;
case GL_LINE_STRIP:
glInterleavedArrays( GL_C4UB_V3F, 0, g_lineStrip_and_lineLoop );
glDrawArrays( GL_LINE_STRIP, 0, 6 );
break;
case GL_LINE_LOOP:
glInterleavedArrays( GL_C4UB_V3F, 0, g_lineStrip_and_lineLoop );
glDrawArrays( GL_LINE_LOOP, 0, 6 );
break;
case GL_TRIANGLES:
glInterleavedArrays( GL_C4UB_V3F, 0, g_triangles );
glDrawArrays( GL_TRIANGLES, 0, 6 );
break;
case GL_TRIANGLE_STRIP:
glInterleavedArrays( GL_C4UB_V3F, 0, g_triangleStrip );
glDrawArrays( GL_TRIANGLE_STRIP, 0, 8 );
break;
case GL_TRIANGLE_FAN:
glInterleavedArrays( GL_C4UB_V3F, 0, g_triangleFan );
glDrawArrays( GL_TRIANGLE_FAN, 0, 6 );
break;
case GL_QUADS:
glInterleavedArrays( GL_C4UB_V3F, 0, g_quads );
glDrawArrays( GL_QUADS, 0, 12 );
break;
case GL_QUAD_STRIP:
glInterleavedArrays( GL_C4UB_V3F, 0, g_quadStrip );
glDrawArrays( GL_QUAD_STRIP, 0, 8 );
break;
case GL_POLYGON:
glInterleavedArrays( GL_C4UB_V3F, 0, g_polygon );
glDrawArrays( GL_POLYGON, 0, 5 );
break;
default:
break;
}
SwapBuffers( _hDC );
} while (false);
}
/**
* 生成投影矩阵
* 后面为了重用性,我们会写一个专门的matrix类,完成矩阵的一系列擦做
* 这个是很有必须要的,当你对Opengl了解的不断深入,你会发现,很多都是和数学有关的
*/
void perspective(float fovy,float aspect,float zNear,float zFar,float matrix[4][4])
{
assert(aspect != float(0));
assert(zFar != zNear);
#define PI 3.14159265358979323f
float rad = fovy * (PI / 180);
float halfFovy = tan(rad / float(2));
matrix[0][0] = float(1) / (aspect * halfFovy);
matrix[1][1] = float(1) / (halfFovy);
matrix[2][2] = -(zFar + zNear) / (zFar - zNear);
matrix[2][3] = -float(1);
matrix[3][2] = -(float(2) * zFar * zNear) / (zFar - zNear);
#undef PI
}
virtual void onInit()
{
/**
* 调用父类的函数。
*/
CELL::Graphy::CELLWinApp::onInit();
/**
* 设置Opengl的投影方式,改例子里面,我们使用正交投影
* OpenGL的投影方式有两种(我知道的):正交,和透视,有兴趣的可以google下
* 这里采用的窗口坐标系,与Windows窗口坐标一直,左上角为 0,0,右下角为 _winWidth,_winHeight
* 这种投影下绘制出来的物体没有三维感
*/
//glOrtho(0,_winWidth,_winHeight,0,1,-1);
//! 修改投影方式-透视投影,
//! 指定我们要进行操作的矩阵,OpenGL是一个状态机,所以要操作那一个状态的时候,需要进行切换
//! 下面的这句话就是切换到投影矩阵上
//! gluPerspective细节实现,参照下面的网址:http://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml
glMatrixMode( GL_PROJECTION );
#if 0
glLoadIdentity();
gluPerspective( 45.0, (GLdouble)_winWidth / (GLdouble)_winHeight, 0.1, 100.0);
float mat[4][4];
glGetFloatv(GL_PROJECTION_MATRIX,(float*)mat);
#else
//! 这里我们也可以自己按照Opengl的投影方式生成一个投影矩阵,
//! 然后将投影矩阵给OpenGL
GLfloat matrix[4][4] =
{
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0
};
perspective(45.0f, (GLfloat)_winWidth / (GLfloat)_winHeight, 0.1f, 100.0f,matrix);
glLoadMatrixf((float*)matrix);
#endif
glClearColor(0,0,0,1);
}
virtual int events(unsigned msg, unsigned wParam, unsigned lParam)
{
switch(msg)
{
case WM_KEYDOWN:
{
if (wParam == 'S' ||wParam == 'S')
{
_primitiveType += 1;
if (_primitiveType >=GL_POLYGON )
{
_primitiveType = 0;
}
}
}
break;
}
return __super::events(msg,wParam,lParam);
}
protected:
unsigned _primitiveType;
};
int CALLBACK _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nShowCmd
)
{
Tutorial2 winApp(hInstance);
winApp.start(640,480);
return 0;
}
OpenGL3-绘制各种图元绘制的更多相关文章
- 12-UIKit(View绘制、绘制曲线、绘制文字、贴图)
目录: 1. View绘制 2. 绘制曲线 3. 绘制文字 4. 贴图 回到顶部 1. View绘制 1.1 做出自己的视图对象 TRCell : UITableViewCell : UIView U ...
- ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等--绘制点、线、圆,显示提示信息
ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等--绘制点.线.圆,显示提示信息 /// <summary> /// 绘制界面上的点和线 /// ...
- Unity3D研究院之游戏对象的访问绘制线与绘制面详解(十七)
一眨眼学习Unity3D 也有一段时间了,基本已经拿下了这套游戏引擎,回过头来想想以前写的RPG 游戏引擎,越来越发现以前写的就是垃圾.人果然是要不断学习与不断进步,好好学习,天天向上.哇咔咔- 加油 ...
- WebGL学习笔记二——绘制基本图元
webGL的基本图元点.线.三角形 gl.drawArrays(mode, first,count) first,代表从第几个点开始绘制即顶点的起始位置 count,代表绘制的点的数量. mode,代 ...
- cocos2d-x 绘制基本图元
转自:http://4137613.blog.51cto.com/4127613/754729 第一部分:基本图形绘制 cocos2dx封装了大量opengl函数,用于快速绘制基本图形,这些代码的 ...
- 【转】cocos2d-x学习笔记03:绘制基本图元
第一部分:基本图形绘制 cocos2dx封装了大量opengl函数,用于快速绘制基本图形,这些代码的例子在,tests\DrawPrimitivesTest目录下 注意,该方法是重载node的draw ...
- unity绘制线和绘制面
绘制线条代码,其实就是指定至少两个点,然后赋予贴图即可,不废话,上代码: using UnityEngine; using System.Collections; public class LineT ...
- html5 Canvas绘制时钟以及绘制运动的圆
1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...
- IOS 绘制基本图形( 画圆、画线、画圆弧、绘制三角形、绘制四边形)
// 当自定义view第一次显示出来的时候就会调用drawRect方法- (void)drawRect:(CGRect)rect { // 1.获取上下文 CGContextRef ctx = UIG ...
随机推荐
- SRV记录说明
SRV记录是DNS服务器的数据库中支持的一种资源记录的类型,它记录了哪台计算机提供了哪个服务这么一个简单的信息 SRV 记录:一般是为Microsoft的活动目录设置时的应用.DNS可以独立于活动 ...
- 解决用Eclipse开发Android程序时不能生成R.java的问题
今天我照着Mars老师的视频教程开始学习Android程序开发. 但是,我的Eclipse死活不能生成R.java文件,新建的工程也不行. 然后我百度,百度出来的结果一般是说这样解决: 1.clean ...
- setuptools的使用
1.什么是setuptools setuptoolssetuptools是 Python Enterprise Application Kit(PEAK)的一个副项目,是Python distutil ...
- Struts2 学习笔记 11 Result part2
之前学习了result type 和global result 我们现在来说一下 1.Dynamic Result动态结果集.先来看一下小项目的目录 首页的两个链接访问user/user?type=1 ...
- Swift常用语法示例代码(一)
此篇文章整理自我以前学习Swift时的一些练习代码,其存在的意义多是可以通过看示例代码更快地回忆Swift的主要语法. 如果你想系统学习Swift或者是Swift的初学者请绕路,感谢Github上Th ...
- iOS开发——实用篇&提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- RedHat Enterprise Linux下配置yum源(尝试过的可行方案)
转自:http://bbs.51cto.com/thread-861410-1.html 一.在linux 6.1中本地yum源配置:首先编辑yum源配置文件我们可以再这个目录中新创建一个配置文件,v ...
- 使用Areas(区域)分离ASP.NET MVC 项目
在使用Areas区域时,如果使用默认路由表,将造成路由表冲突,这种情况需要修改一下区域内<区域名称>AreaRegistration.cs和/App_Start/RouteConfig.a ...
- vs2012调试时为什么会出现clr.dll与mscordacwks.dll版本不匹配
第一次开发wpf程序,就遇到了上述问题,最后发现是因为vs2012默认用的是.net4.5,将版本改为.net4就好了,问题解决
- Java SE ---算术运算符
算术运算符:(加)+,(减)-,(乘)*,(除)/,(求余)%,自增自减 一,算数运算符:当有若干个变量参与运算时,结果类型取决于这些变量中表示范围最大的那个变量类型.如果参加运算的变量中有整型int ...