OpenGL 3D绘图:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
angle = angle + 0.1f;
if(angle >= 360.0f)
angle = 0.0f;
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
SwapBuffers(g_HDC);
键盘消息:WM_KEYDOWN
int fwKey;//虚拟键编码
LPARAM keyData;
fwKeys = (int)wParam;
keyData = lparam;
switch(fwKey)
{
case VK_ESCAPE:
PostQuitMessage(0);//发送退出消息
break;
default:
break;
}
主循环已经改造完毕;接下来创建openGL类
cgfxOpenGL.h//设计一个C++类
#ifndef __GL_COMPONENT
#define __GL_COMPONENT
#define PI 3.14159
#define TWO_PI PI*2.0
class CGfxOpenGL{
private:
int m_windowWidth;
int m_windowHeight;
float m_angle;
public:
CGfxOpenGL();
virtual ~CGfxOpenGL();
bool init();
bool shutdown();
void setupProjection(int width, int height);
void prepare(float dt);
void render();
};
#endif
cgfxOpenGL.cpp
#include <windows.h>
#include <gl/GL.h>//openGL 的头文件要用到Windows的头文件
#include <gl/GLUT.h>
#include "cfgxOpenGL.h"
#pragma warning(disable:4305) //禁止单精度浮点数自动转化为双精度浮点数,保持OpenGL原有的单精度浮点数
CGfxOpenGL::CGfxOpenGL(){}
CGfxOpenGL::~CGfxOpenGL(){}
bool CGfxOpenGL::init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);//把背景全部变为黑色
m_angle = 0.0f;
return true;
}
bool CGfxOpenGL::shutdown()
{
return true;
}
void CGfxOpenGL::setupProjection(int width, int height)
{
if(height == 0)
height = 1;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 1.0f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
m_windowWidth = width;
m_windowHeight = height;
}
void CGfxOpenGL::prepare(float dt)
{
m_angle = m_angle + 0.1f;
if(m_angle >= 360.0f)
m_angle = 0.0f;
}
void CGfxOpenGL::render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(m_angle, 0.0f, 0.0f, 1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
}
}
=========================================================
demo.cpp
#include “cgfxOpenGL.h"
CGfxOpenGL *g_glRender = NULL;
g_glRender = new CGfxOpenGL;
g_glRender->init(); //消息循环之前调用
while(!exit)
{
g_glRender->prepare(0.0);
g_glRender->render();
SwapBuffers(g_HDC);
}
case WM_SIZE:
height = HIWORD(lParam);
width = LOWORD(lParam);
g_glRender->setupProjection(width, height);
break;