加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从位图图像中读取2D纹理(C ++,OpenGL)

发布时间:2020-12-16 09:16:36 所属栏目:百科 来源:网络整理
导读:一共有2个.cpp文件和1个.h头文件 步骤: 需要安装GLUT,因为 GLUT是第三方库,即它不是OpenGL的一部分。 因此,它不是Windows系统API的一部分,因此不属于标准Windows SDK。 下载链接: http://files.transmissionzero.co.uk/software/development/GLUT/free

一共有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 Texturesn";
    fread(&bfh,sizeof(BITMAPFILEHEADER),1,file);
    if (bfh.bfType != 0x4D42)
        std::cout << "CRASH:Invalid Texture Formatn";
    fread(&bih,sizeof(BITMAPINFOHEADER),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_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_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);
            glRotatef(90.0,1.0,0.0);
            glTranslatef(1.0,0.0);

        }
        else if (i == 2)
        {
            glTranslatef(0.0,-2.0);
            glRotatef(180.0,0.0);
        }
        else if (i == 3)
        {
            glTranslatef(-1.0,0.0);
            glRotatef(-90.0,0.0);
            glTranslatef(-1.0,0.0);
        }
        else if (i == 4)
        {
            glTranslatef(0.0,0.0);
            glTranslatef(0.0,0.0);
        }
        else if (i == 5)
        {
            glTranslatef(0.0,-1.0,0.0);
        }
        glBegin(GL_QUADS);
        glTexCoord2f(1.0,1.0);        glVertex3f(1.0,0.0);
        glTexCoord2f(0.0,1.0);        glVertex3f(-1.0,0.0);        glVertex3f(-1.0,0.0);
        glTexCoord2f(1.0,0.0);        glVertex3f(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,50.0);
    glMatrixMode(GL_MODELVIEW);
}

void anim()
{
    glutPostRedisplay();
    theta += 1;
}

调试结果:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读