- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章VC运用OPENGL加载BMP纹理图的实现方法汇总由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
OpenGL是专业的图形程序接口,功能非常强大,调用方便的底层图形库。本文汇总了运用OPENGL加载BMP纹理图的几个实现方法.
方法一:
首先获取位图句柄:
1
|
HBITMAP
hBmp = (
HBITMAP
) ::LoadImage (AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0,LR_CREATEDIBSECTION);
|
然后根据位图句柄得到位图信息:
1
2
|
BITMAP BM;
::GetObject (hBmp,
sizeof
(BM), &BM);
|
最后根据位图信息中的RGB值建立纹理:
1
|
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, BM.bmWidth, BM.bmHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE,BM.bmBits);
|
方法二:
首先用OpenGL辅助库获得位图信息:
1
2
|
AUX_RGBImageRec* TextureImage[1];
TextureImage[0]=auxDIBImageLoad(
"1.bmp"
);
|
然后建立纹理 。
1
|
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
|
方法三: 从底层做,需要了解bmp文件的结构,首先读取bmp文件结构,包括文件头、信息头和数据,数据用于后面定义纹理 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
long
ImageWidth=256;
long
ImageHeight=256;
GLubyte Image[256][256][3];
void
ReadHeader(
FILE
*fp , BITMAPFH * p_bitmapheader , BITMAPIH *p_bitmapinfo)
{
fseek
(fp, 0, SEEK_SET) ;
fread
( &p_bitmapheader->bfType,
sizeof
(unsigned
short
), 1, fp );
fseek
(fp, 2, SEEK_SET) ;
fread
( &p_bitmapheader->bfSize,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 6, SEEK_SET) ;
fread
( &p_bitmapheader->bfReserved1,
sizeof
(unsigned
short
), 1, fp );
fseek
(fp, 8, SEEK_SET) ;
fread
( &p_bitmapheader->bfReserved2,
sizeof
(unsigned
short
), 1, fp );
fseek
(fp, 10, SEEK_SET) ;
fread
( &p_bitmapheader->bfOffBits,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 14, SEEK_SET) ;
fread
( &p_bitmapinfo->biSize,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 18, SEEK_SET) ;
fread
( &p_bitmapinfo->biWidth,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 22, SEEK_SET) ;
fread
( &p_bitmapinfo->biHeight,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 26, SEEK_SET) ;
fread
( &p_bitmapinfo->biPlanes,
sizeof
(unsigned
short
), 1, fp );
fseek
(fp, 28, SEEK_SET) ;
fread
( &p_bitmapinfo->biBitCount,
sizeof
(unsigned
short
), 1, fp );
fseek
(fp, 30, SEEK_SET) ;
fread
( &p_bitmapinfo->biCompression,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 34, SEEK_SET) ;
fread
( &p_bitmapinfo->biSizeImage,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 38, SEEK_SET) ;
fread
( &p_bitmapinfo->biXPelsPerMeter,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 42, SEEK_SET) ;
fread
( &p_bitmapinfo->biYPelsPerMeter,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 46, SEEK_SET) ;
fread
( &p_bitmapinfo->biClrUsed,
sizeof
(unsigned
long
), 1, fp );
fseek
(fp, 50, SEEK_SET) ;
fread
( &p_bitmapinfo->biClrImportant,
sizeof
(unsigned
long
), 1, fp );
}
void
ReadBitmapFile()
{
BITMAPFH bitmapheader ;
BITMAPIH bitmapinfo ;
FILE
*fp;
fp =
fopen
(
"6.bmp"
,
"r"
) ;
if
(!fp)
{
puts
(
"Read file failed."
) ;
return
;
}
ReadHeader(fp, &bitmapheader , &bitmapinfo) ;
if
(bitmapinfo.biBitCount != 24)
{
puts
(
"UNSUPPORT"
) ;
return
;
}
ImageWidth = bitmapinfo.biWidth;
ImageHeight = bitmapinfo.biHeight;
int
i=bitmapheader.bfOffBits;
while
(i<bitmapheader.bfSize)
{
for
(
int
j=0;j<ImageWidth;j++)
for
(
int
k=0;k<ImageHeight;k++)
{
fseek
(fp, i, SEEK_SET) ;
fread
(Image[j][k]+2, 1, 1, fp) ;
fseek
(fp, i+1, SEEK_SET) ;
fread
(Image[j][k]+1, 1, 1, fp) ;
fseek
(fp, i+2, SEEK_SET) ;
fread
(Image[j][k], 1, 1, fp) ;
i=i+3;
}
}
fclose
(fp) ;
}
glTexImage2D(GL_TEXTURE_2D,0,3,ImageWidth,ImageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,&Image[0][0][0]);
|
#include <gl\glext.h> 这是因为后面的GL_BGR_EXT是定义在这个头文件里的,因为BMP格式是按Blue,Green,Red顺序储存图像数据的,这与OpenGL中正好相反。GL_BGR_EXT就是完成两者之间的转换的.
下面就是不用AUX库来加载BMP图片作为纹理的函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
bool
LoadTexture(
LPTSTR
szFileName, GLuint &texid)
// Creates Texture From A Bitmap File
{
HBITMAP
hBMP;
// Handle Of The Bitmap
BITMAP BMP;
// Bitmap Structure
glGenTextures(1, &texid);
// Create The Texture
hBMP=(
HBITMAP
)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
if
(!hBMP)
// Does The Bitmap Exist?
return
FALSE;
// If Not Return False
GetObject(hBMP,
sizeof
(BMP), &BMP);
// Get The Object
// hBMP: Handle To Graphics Object
// sizeof(BMP): Size Of Buffer For Object Information
// &BMP: Buffer For Object Information
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
// Pixel Storage Mode (Word Alignment / 4 Bytes)
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texid);
// Bind To The Texture ID
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// Linear Min Filter
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Linear Mag Filter
glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
DeleteObject(hBMP);
// Delete The Object
return
TRUE;
// Loading Was Successful
}
|
最后此篇关于VC运用OPENGL加载BMP纹理图的实现方法汇总的文章就讲到这里了,如果你想了解更多关于VC运用OPENGL加载BMP纹理图的实现方法汇总的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我怎样才能将 numberGrade 的值调高,如果它是 89.5,它会变成 90。numberGrade 被当作 double ,但将它设为 int 并不会向上或向下舍入。 public class
经过了漫长时间的移植和查询资料,得以解决一下嵌入式docker出现的问题,很多网上的资料全都是复制粘贴复制粘贴,找不到合适的解决方法让人很是苦恼,希望自己总结出的一些解决问题的经验给广大朋友减少一些
之前我是通过脚本来使用库的: 现在我使用 yarn 和 rollup 来构建带有下一个文件的项目。包.json: { "name": "maplib", "version": "1.0.0",
在 R 中,我正在尝试使用不同的窗口宽度对大向量(最多 400k 个元素)进行非常快速的滚动平均值,然后对于每个窗口宽度按每年的最大值汇总数据。下面的例子希望是清楚的。 我尝试了几种方法,到目前为止最
我想问一下我应该如何解决这个问题,因为我已经对这部分感到困惑和困惑。我已经使用这个命令全局安装了汇总 npm install --global rollup 但是,当我尝试运行“汇总”命令时,我应该期
我正在构建 javascript 库(更像是小部件),其中将包含一些 UI。我正在通过 javascript 向 DOM 添加 HTML 元素。要添加此 HTML,我有以下代码: async inse
我在显示一份报告时遇到了一些困难,该报告既可以将所有日期分组到月中,又可以对月中每天的“支出”求和。 我的 SQL 查询创建了这个:(检索所有日期) Date
我正在从事 Angular2 项目。我浏览了 Angular2 aot 文档并且能够生成 ngFactory 文件。我按照文档中的建议使用了 rollup js。我有一些非 es6 npm 包。我已经
我目前正在构建 Ionic 2-RC3 应用程序。但是自从我升级到 RC-1 后,我遇到了以下错误:(不确定它们是否保持不变,但你明白了)。 [15:16:17] rollup: Conflicti
Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及 Arabic, Israel (ar_IL) -----------------
我正在尝试汇总我的完全 es6 模块存储库,该存储库具有项目的本地导入/导出,以及对也是脚本或模块的依赖项的导入。 我也在尝试进行双重构建,通过汇总创建遗留的 iife 模块。 这仅适用于我的项目,没
我有一个由 DayTots 类对象组成的 VBA 集合(见下文) 我正在使用 For Each 遍历集合以创建一个 由汇总记录组成的新集合,基于日期 有什么方法可以用 Linq 做到这一点吗?我怀疑也
这是我第一次尝试理解/使用汇总。 我正在使用 this boilerplate因为它都是基于three.js,我也喜欢使用它。 到目前为止,我目前的(几乎肯定是不正确的)方法是: 从github下载样
我有两个 column_property 列,我想在 grandtotal 列中将它们加在一起。我希望能够根据 grandtotal 列进行排序和过滤。 如何对 subtotal 和 shipping
我收到以下错误消息: Error: Parse Error: Line 29: Unexpected token ILLEGAL 对应的代码行是 mobx 观察者装饰器: @observer clas
我真的坚持这一点,我真的很感激这方面的任何帮助。 目标是计算 Woocommerce 订单上每个类别中的项目数量,以便每个部分都可以以类别名称和产品数量为标题。例如: 汉堡 x 5 在此下方将是该订单
我正在从路由器收集传输数据;它提供每日,每月和每两分钟(间隔为120秒)的摘要。如果我在一天中(因此一个月中)重启路由器,则这些报告将不完整。但是,我仍然会得到间隔数据,并且可以对引导前后的记录进行汇
假设我有一个像这样的数据框: a b c d e f 1. 1 5 5 9 2 3 2. 4 7 3 1 4 6 3. 2 3 8 9
假设我有一个记录列表,我想通过取中位数来总结它。更具体地说,说我有 data Location = Location { x :: Double, y :: Double } 我有一个测量列表,我想将
我刚刚开始使用 AngularJS。我需要从 AngularJS 的书中升级这个购物车示例,以便所有 (items.price*item.quantity) 的总数显示在页面底部。实现它的推荐方法是什
我是一名优秀的程序员,十分优秀!