从位图图像中读取2D纹理(C ++,OpenGL)
Posted strive-sun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从位图图像中读取2D纹理(C ++,OpenGL)相关的知识,希望对你有一定的参考价值。
一共有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 = 0; file = fopen(filename, "rb"); if (!file) std::cout << "Missing Textures\\n"; fread(&bfh, sizeof(BITMAPFILEHEADER), 1, file); if (bfh.bfType != 0x4D42) std::cout << "CRASH:Invalid Texture Format\\n"; fread(&bih, sizeof(BITMAPINFOHEADER), 1, file); if (bih.biSizeImage == 0) bih.biSizeImage = bih.biHeight*bih.biWidth * 3; textureData = new unsigned char[bih.biSizeImage]; fseek(file, bfh.bfOffBits, SEEK_SET); fread(textureData, 1, bih.biSizeImage, file); unsigned char temp; for (int i = 0; i < bih.biSizeImage; i += 3) temp = textureData[i]; textureData[i] = textureData[i + 2]; textureData[i + 2] = 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 = 0; 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(1, &ID); glBindTexture(GL_TEXTURE_2D, ID); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 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(500, 500); glutCreateWindow("TEX"); LoadTexture("panda.bmp"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(anim); init(); glutMainLoop(); return 0; 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 = 0; i < 6; i++) glPushMatrix(); if (i == 1) 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 == 2) glTranslatef(0.0, 0.0, -2.0); glRotatef(180.0, 0.0, 1.0, 0.0); else if (i == 3) 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 == 4) 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 == 5) 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(0, 0, (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 += 1;
调试结果:
以上是关于从位图图像中读取2D纹理(C ++,OpenGL)的主要内容,如果未能解决你的问题,请参考以下文章