显示列表
打包所有状态到显存 不需要每次都调用那么多函数
创建显示列表
_cubeDisplay = 1;
glNewList(_cubeDisplay,GL_COMPILE);
renderCube();
结束指令
glEndList();
绘制
glCallList(_cubeDisplay);
一个指令完成之前的绘制命令
也可以将显示列表放在一个数组里面 unsigned char list[] = {_cubeDisplay,_maskDisplay};
绘制时候使用 glCallLists(2,GL_UNSIGNED_BYTE,list);
#include "OpenGLWindow.h"
#include <mmsystem.h>
#include "freeimage.h"
#include "CELLMath.hpp"
using namespace CELL;
struct Vertex
{
float x, y, z;
float u, v;
};
class Sprite :public OpenGLWindow
{
public:
GLuint _texture1;
GLuint _texture2;
GLuint _texture3;
GLuint _cubeDisplay;
GLuint _maskDisplay;
public:
unsigned createTexture(int w, int h, const void* data, GLenum type)
{
unsigned texId;
glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, type, w, h, 0, type, GL_UNSIGNED_BYTE, data);
return texId;
}
/**
* ʹ��FreeImage����ͼƬ
*/
unsigned createTextureFromImage(const char* fileName)
{
//1 ��ȡͼƬ��ʽ
FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(fileName, 0);
if (fifmt == FIF_UNKNOWN)
{
return 0;
}
//2 ����ͼƬ
FIBITMAP *dib = FreeImage_Load(fifmt, fileName, 0);
FREE_IMAGE_COLOR_TYPE type = FreeImage_GetColorType(dib);
//! ��ȡ����ָ��
FIBITMAP* temp = dib;
dib = FreeImage_ConvertTo32Bits(dib);
FreeImage_Unload(temp);
BYTE* pixels = (BYTE*)FreeImage_GetBits(dib);
int width = FreeImage_GetWidth(dib);
int height = FreeImage_GetHeight(dib);
for (int i = 0; i < width * height * 4; i += 4)
{
BYTE temp = pixels[i];
pixels[i] = pixels[i + 2];
pixels[i + 2] = temp;
}
unsigned res = createTexture(width, height, pixels, GL_RGBA);
FreeImage_Unload(dib);
return res;
}
public:
virtual void onInitGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, double(_width) / double(_height), 0.1f, 100.0f);
_texture1 = createTextureFromImage("floor.bmp");
_texture2 = createTextureFromImage("CrossHair.bmp");
_texture3 = createTextureFromImage("CrossHairMask.bmp");
_cubeDisplay = 1;
glNewList(_cubeDisplay,GL_COMPILE);
renderCube();
glEndList();
_maskDisplay = 2;
glNewList(_maskDisplay,GL_COMPILE);
renderOrth();
glEndList();
}
virtual void onShutdownGL()
{
glDeleteTextures(1, &_texture1);
glDeleteTextures(1, &_texture2);
glDeleteTextures(1, &_texture3);
glDeleteLists(_cubeDisplay,1);
glDeleteLists(_maskDisplay, 1);
}
void renderCube()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, double(_width) / double(_height), 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
// Bind the wall texture to the wall quads
glBindTexture(GL_TEXTURE_2D, _texture1);
// Display a 4 long quads to represent walls
glBegin(GL_QUADS);
// BACK WALL ///
glTexCoord2f(0.0f, 2.0f); glVertex3f(-15, 1, -15);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-15, -1, -15);
glTexCoord2f(12.0f, 0.0f); glVertex3f(15, -1, -15);
glTexCoord2f(12.0f, 2.0f); glVertex3f(15, 1, -15);
// FRONT WALL ///
glTexCoord2f(0.0f, 2.0f); glVertex3f(-15, 1, 15);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-15, -1, 15);
glTexCoord2f(12.0f, 0.0f); glVertex3f(15, -1, 15);
glTexCoord2f(12.0f, 2.0f); glVertex3f(15, 1, 15);
// LEFT WALL ///
glTexCoord2f(0.0f, 2.0f); glVertex3f(-15, 1, -15);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-15, -1, -15);
glTexCoord2f(12.0f, 0.0f); glVertex3f(-15, -1, 15);
glTexCoord2f(12.0f, 2.0f); glVertex3f(-15, 1, 15);
// RIGHT WALL ///
glTexCoord2f(0.0f, 2.0f); glVertex3f(15, 1, -15);
glTexCoord2f(0.0f, 0.0f); glVertex3f(15, -1, -15);
glTexCoord2f(12.0f, 0.0f); glVertex3f(15, -1, 15);
glTexCoord2f(12.0f, 2.0f); glVertex3f(15, 1, 15);
// Stop drawing the walls
glEnd();
// Bind this texture to the floor quad
glBindTexture(GL_TEXTURE_2D, _texture1);
// Display a huge quad to represent a floor
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 16.0f); glVertex3f(-15, -1, -15);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-15, -1, 15);
glTexCoord2f(16.0f, 0.0f); glVertex3f(15, -1, 15);
glTexCoord2f(16.0f, 16.0f); glVertex3f(15, -1, -15);
// Stop drawing the floor
glEnd();
}
void renderOrth()
{
glMatrixMode