一共有2个.cpp文件和1个.h头文件

步骤:

需要安装GLUT,因为GLUT是第三方库,即它不是OpenGL的一部分。因此,它不是Windows系统API的一部分,因此不属于标准Windows SDK。

下载链接:http://files.transmissionzero.co.uk/software/development/GLUT/freeglut-MSVC.zip

安装方法:

在PC上创建一个可供所有用户读取的文件夹,例如典型Windows系统上的“C:\ Program Files \ Common Files \ MSVC \ freeglut \”。将此zip存档中的“lib”和“include \”文件夹复制到该位置。

相应的freeglut DLL可以放在与应用程序相同的文件夹中,也可以安装在%PATH%环境变量中显示的系统范围文件夹中。注意不要将32位DLL与64位DLL混合,因为它们不可互换。

编译32位应用程序

要创建32位freeglut应用程序,请在MSVC中创建一个新的Win32 C ++项目。从“Win32应用程序向导”中,选择“Windows应用程序”,选中“清空项目”框,然后提交。

你现在需要配置编译器和链接器设置。打开项目属性,然后选择“所有配置”(这是确保我们的更改应用于调试和发布版本所必需的)。打开“C / C ++”下的“常规”部分,将上面创建的“include \”文件夹配置为“附加包含目录”。如果您有多个包含“glut.h”文件的GLUT包,请务必确保freeglut include文件夹出现在所有其他GLUT包含文件夹的上方。

现在打开“链接器”下的“常规”部分,并将您在上面创建的“lib”文件夹配置为“附加库目录”。freeglut应用程序依赖于导入库“freeglut.lib”和“opengl32.lib”,它们可以在“输入”部分下配置。但是,没有必要明确说明这些依赖项,因为freeglut标头会为您处理此问题。现在打开“高级”部分,输入“mainCRTStartup”作为应用程序的“入口点”。这是必要的,因为GLUT应用程序使用“main”作为应用程序入口点,而不是“WinMain” - 在您尝试链接应用程序时,您将获得未定义的引用。

这是您配置的所有项目属性,因此您现在可以将源文件添加到项目中并构建应用程序。如果您希望您的应用程序与GLUT兼容,您应该“#include <GL / glut.h>”。如果要使用freeglut特定扩展,则应改为“#include <GL / freeglut.h>”。

不要忘记在分发应用程序时包含freeglut DLL,或者为用户提供一些获取它的方法(如果他们还没有它)!

确保freeglut.dll在pf(86x).msvs 11.0 \ vc \ bin中确保freeglut.h在pf(86x).msvs 11.0 \ vc \ include \ GL中确保freeglut.lib在pf(86x)中。 msvs 11.0 \ _vc \ lib

编译64位应用程序

构建64位应用程序几乎与构建32位应用程序相同。使用配置管理器添加x64平台时,最简单的方法是从Win32平台复制设置。如果这样做,则只需更改“其他包含目录”配置,以便它引用包含64位导入库而不是32位导入库的目录。

上述都完成后,就可以新创建一个空的win32项目,然后将下面代码拷贝进去

BmpLoader.h

#ifndef BMPLOADER_H
#define BMPLOADER_H #include <windows.h> class BmpLoader {
public:
unsigned char* textureData;
int iWidth, iHeight;
BmpLoader(const char*);
~BmpLoader(); private:
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
}; #endif

BmpLoader.cpp

#include <stdio.h>
#include <stdlib.h>
#include "BmpLoader.h"
#include <iostream> using namespace std;
#pragma warning(disable : 4996)
BmpLoader::BmpLoader(const char* filename)
{
FILE * file = ;
file = fopen(filename, "rb");
if (!file)
std::cout << "Missing Textures\n";
fread(&bfh, sizeof(BITMAPFILEHEADER), , file);
if (bfh.bfType != 0x4D42)
std::cout << "CRASH:Invalid Texture Format\n";
fread(&bih, sizeof(BITMAPINFOHEADER), , file);
if (bih.biSizeImage == )
bih.biSizeImage = bih.biHeight*bih.biWidth * ;
textureData = new unsigned char[bih.biSizeImage];
fseek(file, bfh.bfOffBits, SEEK_SET);
fread(textureData, , bih.biSizeImage, file);
unsigned char temp;
for (int i = ; i < bih.biSizeImage; i += )
{
temp = textureData[i];
textureData[i] = textureData[i + ];
textureData[i + ] = temp;
}
iWidth = bih.biWidth;
iHeight = bih.biHeight;
fclose(file);
} BmpLoader::~BmpLoader()
{
delete[] textureData; }

main.cpp

#include <GL/GLUT.h>
#include "BmpLoader.h"
#include <iostream> using namespace std; int theta = ; unsigned int ID;
void display();
void anim();
void reshape(int, int); void init()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
} void LoadTexture(const char* filename)
{
BmpLoader bl(filename);
glGenTextures(, &ID);
glBindTexture(GL_TEXTURE_2D, ID);
glPixelStorei(GL_UNPACK_ALIGNMENT, );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bl.iWidth, bl.iHeight, GL_RGB, GL_UNSIGNED_BYTE, bl.textureData);
} int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(, );
glutCreateWindow("TEX");
LoadTexture("panda.bmp");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(anim);
init();
glutMainLoop();
return ;
} void display()
{
glEnable(GL_TEXTURE_2D);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0, 0.0, -6.0);
glRotatef(theta, 1.0, 2.0, 0.0);
for (int i = ; i < ; i++)
{
glPushMatrix();
if (i == )
{
glTranslatef(1.0, 0.0, 0.0);
glRotatef(90.0, 0.0, 1.0, 0.0);
glTranslatef(1.0, 0.0, 0.0); }
else if (i == )
{
glTranslatef(0.0, 0.0, -2.0);
glRotatef(180.0, 0.0, 1.0, 0.0);
}
else if (i == )
{
glTranslatef(-1.0, 0.0, 0.0);
glRotatef(-90.0, 0.0, 1.0, 0.0);
glTranslatef(-1.0, 0.0, 0.0);
}
else if (i == )
{
glTranslatef(0.0, 1.0, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glTranslatef(0.0, 1.0, 0.0);
}
else if (i == )
{
glTranslatef(0.0, -1.0, 0.0);
glRotatef(90.0, 1.0, 0.0, 0.0);
glTranslatef(0.0, -1.0, 0.0);
}
glBegin(GL_QUADS);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glEnd();
glPopMatrix();
}
glutSwapBuffers();
glDisable(GL_TEXTURE_2D);
} void reshape(int w, int h)
{
glViewport(, , (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 50.0);
glMatrixMode(GL_MODELVIEW);
} void anim()
{
glutPostRedisplay();
theta += ;
}

调试结果:

从位图图像中读取2D纹理(C ++,OpenGL)的更多相关文章

  1. DirectX11--深入理解与使用2D纹理资源

    前言 写教程到现在,我发现有关纹理资源的一些解说和应用都写的太过分散,导致连我自己找起来都不方便.现在决定把这部分的内容整合起来,尽可能做到一篇搞定所有2D纹理相关的内容,其中包括: DDSTextu ...

  2. 在DirectX 中进行2D渲染

    http://flcstudio.blog.163.com/blog/static/756035392008115111123672/ 最近,我看到很多关于DirectX8在最新的API中摒弃Dire ...

  3. QT+OpenGL读取显示图片,OpenGL在QT里的刷新问题(好几篇)

    GLuint readImage(char *filename){    GLuint tex_id;    GLint alignment; QImage tex, buf;    buf.load ...

  4. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

  5. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  6. 条形码的应用三-----------从Excel文件中读取条形码

    条形码的应用三------从Excel文件中读取条形码 介绍 上一篇文章,我向大家展示了生成多个条形码并存储到Excel文件中的一个方法.后来我又有了个想法:既然条码插入到excel中了,我可不可以从 ...

  7. 从多个XML文档中读取数据用于显示webapi帮助文档

    前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...

  8. Servlet从本地文件中读取图片,并显示在页面中

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  9. 在ASP.NET 5中读取配置文件

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 在ASP.NET 5中摒弃了之前配置文件的基础结构,引入了一个全新配置文件系统.今天推荐的文 ...

随机推荐

  1. flask url_for后没有带端口号

    问题描述: 在本地运行flask项目,当运行到下面这句代码时,正常重定向 return redirect(url_for('.script_case')) 但项目布署到服务器之后,代码运行一这句话,却 ...

  2. react综合案例-todolist、localstorage缓存数据

    1.工具类storage.js var app ={ set(key,value){ localStorage.setItem(key,JSON.stringify(value)); }, get(k ...

  3. Prism 订阅事件 IEventAggregator 说明

    本节学习了Event Aggregation事件聚合,这个在Prism中很重要,特别是对于Module间的通信.除了前面介绍的Command可以用于模块间的通信,还有我们这一节介绍的Event Agg ...

  4. OpenStack 虚拟机的磁盘文件类型与存储方式

    目录 文章目录 目录 虚拟机的磁盘文件类型 虚拟机磁盘文件的存放方式 QCOW2 镜像格式与 qemu-img 指令 参考文章 虚拟机的磁盘文件类型 Nova 虚拟机的虚拟磁盘主要包含有 Root D ...

  5. 大众点评cat监控平台搭建

    参考官方文档:https://github.com/dianping/cat/wiki/readme_server 1.数据库相关 (1)创建数据库cat,并执行以下sql创建相关表: CREATE ...

  6. Day01:API文档 / 字符串基本操作

    JDK API 什么是JDK API? JDK中包含大量的API类库,所谓AP就是一些写好的,可提供直接调用的功能(在Java语言中,这些功能以类的形式封装). JDK API包含的类库功能强大,经常 ...

  7. 爬虫4之pyquery

    pyquery 初始化 字符串初始化 from pyquery import PyQuery as pq doc = pq(html)#html为需要处理的内容 #方法与CSS选择器相同 print( ...

  8. 【神经网络与深度学习】基于Windows+Caffe的Minst和CIFAR—10训练过程说明

    Minst训练 我的路径:G:\Caffe\Caffe For Windows\examples\mnist  对于新手来说,初步完成环境的配置后,一脸茫然.不知如何跑Demo,有么有!那么接下来的教 ...

  9. 【VS开发】【电子电路技术】RJ45以太网传输线研究

    RJ45以太网传输线研究 最近研究远距离差分视频传输方案,理所当然想到了LVDS协议.至于选用cameralink传输线,还是选用其他方案,本人更倾向于廉价的RJ45以太网线来实现LVDS差分信号的传 ...

  10. 微信小程序开发(二)----- 云开发

    1.概念 微信小程序的云开发是腾讯云与微信团队深度合作推出的一个全新的小程序的解决方案,它提供了云函数.云数据库与云存储这三大基础能力支持,随着云开发的出现,小程序的开发者可以将服务端的部署和运营的环 ...