方法:
先载入纹理图(pLoadTex函数);
再画建立一个二次曲面物体(gluNewQuadric函数),并利用函数gluQuadricTexture声明这个二次曲面可以贴纹理;
在paintGL函数里,只要调用glBindTexture和gluSphere函数,即可绘制地球。
代码:
pro文件:
#-------------------------------------------------
#
# Project created by QtCreator 2017-11-19T07:35:32
#
#-------------------------------------------------
QT += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = GlEarth
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
LIBS += -lopengl32 -lGLU32
h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <GL/GLU.H>
class MainWindow : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
GLUquadricObj * m_pQuadObj;
GLuint m_uiTexture;
unsigned char * pLoadTex(char *, unsigned long &, unsigned long &);
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
};
#endif // MAINWINDOW
cpp:
#include "mainwindow.h"
#include <QDir>
MainWindow::MainWindow(QWidget *parent) :
QOpenGLWidget(parent)
{
}
MainWindow::~MainWindow()
{
glDeleteTextures(1, &m_uiTexture);
gluDeleteQuadric(m_pQuadObj);
}
void MainWindow::initializeGL()
{
initializeOpenGLFunctions();
unsigned long bWidth = 0;
unsigned long bHeight = 0;
QString qstrPath = QDir::currentPath();
qstrPath += "/earth.bmp";
unsigned char * pData = pLoadTex(qstrPath.toLatin1().data(), bWidth, bHeight);
glGenTextures(1, &m_uiTexture);
glBindTexture(GL_TEXTURE_2D, m_uiTexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pData);
glEnable(GL_TEXTURE_2D);
m_pQuadObj = gluNewQuadric();//创建一个二次曲面物体
gluQuadricDrawStyle(m_pQuadObj, GL_FILL);
gluQuadricNormals(m_pQuadObj, GLU_SMOOTH);
gluQuadricOrientation(m_pQuadObj, GLU_OUTSIDE);
gluQuadricTexture(m_pQuadObj,GL_TRUE);
if (pData)
free(pData);
glClearColor(0,0,0,0);
glEnable(GL_DEPTH_TEST);
}
void MainWindow::paintGL()
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glEnable(GL_TEXTURE);
glBindTexture(GL_TEXTURE_2D, m_uiTexture);
gluSphere(m_pQuadObj, 1.0f, 20, 20);
//glDisable(GL_TEXTURE);
//gluDeleteQuadric(m_pQuadObj); //删除二次曲面对象
}
void MainWindow::resizeGL(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/*GLfloat fAspect;
fAspect = (float)w / (float)h;
gluPerspective(45.0, fAspect, 1.0, 500.0);*/
glOrtho(-2, 2, -2, 2, 0, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
unsigned char * MainWindow::pLoadTex(char * Image, unsigned long & bWidth, unsigned long & bHeight)
{
FILE* img = NULL;
img = fopen(Image, "rb");
DWORD size = 0;
fseek(img,18,SEEK_SET);
fread(&bWidth,4,1,img);
fread(&bHeight,4,1,img);
fseek(img,0,SEEK_END);
size = ftell(img) - 54;
unsigned char *data = (unsigned char*)malloc(size);
fseek(img,54,SEEK_SET); // image data
fread(data,size,1,img);
fclose(img);
return data;
}
效果是从南极看地球: