• OPENGL 显示BMP图片+旋转


    VS2010/Windows 7/

    1. 需包含头文件 stdio.h, glaux.h, glut.h。需要对应的lib,并添加包含路径

    2. 窗口显示用glut库的函数

    3. bmp图片从本地读取,再用它来生成纹理,首先用auxDIBImageLoad函数将图片数据读到AUX_RGBImageRec结构体当中。

        然后

    //生成纹理数据
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

       然后用线性滤波函数按自己要求缩放显示

    //线性滤波
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    4. 图片旋转显示的时候用

    glRotatef(-90,0.0f,0.0f,1.0f);

    或 

    //贴图及映射(glTexCoord2f对应纹理坐标, glVertex2f对应矩形坐标,此处已做旋转处理)
    glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, 1.0f);     
    glTexCoord2f(0.0f, 1.0f); glVertex2f( 1.0f, 1.0f);    
    glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f, -1.0f); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(-1.0f, -1.0f);     

    前一种是旋转函数,后一种是直接在坐标映射时改坐标

    效果:

    附代码:

    #include "stdafx.h"
    
    #include <stdio.h>
    #include <gl/glaux.h>
    #include<gl/glut.h>
    
    GLfloat xrot;
    GLfloat yrot;
    GLfloat zrot;
    
    GLuint texture[1]; //存储一个纹理
    
    //读取bmp文件数据
    AUX_RGBImageRec *LoadBMP(char * Filename)
    {
        FILE *File = NULL;
        if (!Filename)
            return NULL;
        File = fopen(Filename, "r");
        if (File)
        {
            fclose(File);
            return auxDIBImageLoad(Filename);
        }
        return NULL;
    }
    
    //生成纹理
    int LoadGLTextures()
    {
        int Status = FALSE;
        AUX_RGBImageRec *TextureImage[1];
        memset(TextureImage, 0, sizeof(void *)*1);
        if (TextureImage[0] = LoadBMP("C:\2.bmp"))
        {
            Status = TRUE;
            //注册纹理
            glGenTextures(1, &texture[0]); 
            //绑定纹理名称
            glBindTexture(GL_TEXTURE_2D, texture[0]);
            //生成纹理数据
            glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
            //线性滤波
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        }
        if (TextureImage[0])
        {
            if (TextureImage[0]->data)
            {
                free(TextureImage[0]->data);
            }
            free(TextureImage[0]);
        }
        return Status;
    }
    
    //调用入口
    int InitGL(GLvoid)
    {
        if (!LoadGLTextures())
        {
            return false;
        }
        glEnable(GL_TEXTURE_2D);
        //glShadeModel(GL_SMOOTH);
        //设置背景色为黑色
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        return TRUE;
    }
    
    //贴图绘制
    void DrawGLScene(GLvoid)
    {
        //清除屏幕缓存
        glClear(GL_COLOR_BUFFER_BIT);    
        //重置当前的模型观察矩阵
        glLoadIdentity();
        
        /**************************************
        * 旋转函数备用 -90表示顺时针绕Z轴旋转90度
        ***************************************/
        //glRotatef(-90,0.0f,0.0f,1.0f);                
        
        //开始绘制四边形
        glBegin(GL_QUADS);
    
        //贴图及映射(glTexCoord2f对应纹理坐标, glVertex2f对应矩形坐标,此处已做旋转处理)
        glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, 1.0f);     
        glTexCoord2f(0.0f, 1.0f); glVertex2f( 1.0f, 1.0f);    
        glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f, -1.0f); 
        glTexCoord2f(1.0f, 0.0f); glVertex2f(-1.0f, -1.0f);     
    
        glEnd();
        glFlush();
        //glutSwapBuffers();
    }
    
    int main(int argc, char **argv)
    {
        //初始化glut运行
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA);
        glutInitWindowPosition(300,100);
        glutInitWindowSize(450, 600);
        glutCreateWindow("hello");
        
        InitGL();
        glutDisplayFunc(&DrawGLScene);
        glutMainLoop();
        return 0;
    }

    (完)

  • 相关阅读:
    Python中的除法
    使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结
    单例模式(Singleton)的6种实现
    Linux关机命令总结
    Java中构造函数执行顺序的问题
    SVN四部曲之SVN命令精通
    SVN四部曲之SVN简单使用教程入门
    SVN四部曲之SVN使用详解进阶
    用正则表达式判断一个二进制数是否能被3整除
    栈帧%ebp,%esp详解
  • 原文地址:https://www.cnblogs.com/fwst/p/3784075.html
Copyright © 2020-2023  润新知