You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.0 KiB
79 lines
2.0 KiB
#include "utils.h"
|
|
|
|
unsigned char * DecodeBMP(unsigned char * bmpFileData, int & width, int & height)
|
|
{
|
|
if (0x4D42 == *((unsigned short*)bmpFileData)) {//通过前两个字节去判断数据是否是BMP数据
|
|
int pixelDataOffset = *((int*)(bmpFileData + 10));//取出位图像素数据的偏移地址、
|
|
width = *((int*)(bmpFileData + 18));//获取图片宽度
|
|
height = *((int*)(bmpFileData + 22));//获取图片宽度
|
|
|
|
/*读取图片内容*/
|
|
unsigned char* pixelData = bmpFileData + pixelDataOffset;
|
|
for (int i = 0; i < width * height * 3; i += 3) {
|
|
unsigned char temp = pixelData[i];
|
|
//BGR 转换成 RGB
|
|
pixelData[i] = pixelData[i + 2];
|
|
pixelData[i + 2] = temp;
|
|
}
|
|
return pixelData;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
GLuint CreateTexture2D(unsigned char * pixelData, int width, int height, GLenum type)
|
|
{
|
|
GLuint texture;
|
|
glGenTextures(1, &texture);
|
|
|
|
//绑定纹理
|
|
glBindTexture(GL_TEXTURE_2D, texture);
|
|
|
|
//设置纹理放大/缩小时候数据采集的算法
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//使用线性过滤
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//使用线性过滤
|
|
|
|
//设置当纹理坐标大于1.0时候的数据采集方式
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
|
|
|
//数据上传到显卡
|
|
glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, pixelData);
|
|
|
|
//释放纹理
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
return texture;
|
|
}
|
|
|
|
GLuint CreateTexture2DFromBMP(const char * bmpPath)
|
|
{
|
|
int nFileSize = 0;
|
|
unsigned char* bmpFileContent = LoadFileContent(bmpPath, nFileSize);
|
|
|
|
if (bmpFileContent == nullptr) {
|
|
return 0;
|
|
}
|
|
|
|
int bmpWidth = 0;
|
|
int bmpHeight = 0;
|
|
unsigned char* pixelData = DecodeBMP(bmpFileContent, bmpWidth, bmpHeight);
|
|
|
|
if (bmpWidth == 0) {
|
|
delete bmpFileContent;
|
|
return 0;
|
|
}
|
|
|
|
GLuint textrue = CreateTexture2D(pixelData, bmpWidth, bmpHeight, GL_RGB);
|
|
|
|
return textrue;
|
|
}
|
|
|
|
GLuint CreateDisplayList(std::function<void()> foo)
|
|
{
|
|
GLuint displayList = glGenLists(1);//申请一个显示列表
|
|
|
|
glNewList(displayList, GL_COMPILE);
|
|
foo();
|
|
glEndList();
|
|
|
|
return displayList;
|
|
}
|