我想在mfc单文档中绘制一个带有纹理的地球,并想让能够旋转
参看了一些文章,要加纹理,可是没能实现,那位高手可指点?
部分代码如下:
void COrbitView::DrawScene()
{
glClearColor(0.1f, 0.5f,0.6f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GLUquadricObj*q=gluNewQuadric();
gluQuadricDrawStyle(q,GLU_FILL);
gluQuadricNormals(q,GLU_SMOOTH);
gluQuadricTexture(q,GL_TRUE);
gluSphere(q,0.3,50,50);
//定义纹理
makeTexture();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
gluBuild2DMipmaps(GL_TEXTURE_2D,4,checkImageWidth,
checkImageHeight,GL_RGBA,GL_UNSIGNED_BYTE,checkImage);
glTexImage2D(GL_TEXTURE_2D,0,4,checkImageWidth,
checkImageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,
&checkImage[0][0][0]);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glBindTexture(GL_TEXTURE_2D,1); glColor3f(0.8,0.0,0.8);
glTexCoord2f(0.0,0.0);
glVertex3f(-2.0,-2.0,0.0);
glTexCoord2f(0.0,1.0);
glVertex3f(-2.0,2.0,0.0);
glTexCoord2f(1.0,1.0);
glVertex3f(2.0,2.0,0.0);
glTexCoord2f(1.0,0.0);
glVertex3f(2.0,-2.0,0.0);
glEnable(GL_TEXTURE_2D);
UpdateData(true); glFinish();
}
void COrbitView::makeTexture()
{
int i, j;
FILE *fp;
unsigned char *image;
int rc; fp = fopen("globe.bmp","rb");
if(!fp) return;
fseek(fp,54,SEEK_SET);
image = (unsigned char *)malloc(checkImageWidth*checkImageWidth*4);
rc=fread(image,sizeof(unsigned char),checkImageWidth*checkImageWidth*4,fp);
fclose(fp);
for(i=0; i<checkImageWidth; i++)
{
for(j=0; j<checkImageWidth; j++)
{
checkImage[i][j][2] = (GLubyte) *(image+i*checkImageWidth*3+j*3);
checkImage[i][j][1] = (GLubyte) *(image+i*checkImageWidth*3+j*3+1);
checkImage[i][j][0] = (GLubyte) *(image+i*checkImageWidth*3+j*3+2);
checkImage[i][j][3] = (GLubyte)255;
}
}
}
“globe.bmp”是一张地球位图
参看了一些文章,要加纹理,可是没能实现,那位高手可指点?
部分代码如下:
void COrbitView::DrawScene()
{
glClearColor(0.1f, 0.5f,0.6f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GLUquadricObj*q=gluNewQuadric();
gluQuadricDrawStyle(q,GLU_FILL);
gluQuadricNormals(q,GLU_SMOOTH);
gluQuadricTexture(q,GL_TRUE);
gluSphere(q,0.3,50,50);
//定义纹理
makeTexture();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
gluBuild2DMipmaps(GL_TEXTURE_2D,4,checkImageWidth,
checkImageHeight,GL_RGBA,GL_UNSIGNED_BYTE,checkImage);
glTexImage2D(GL_TEXTURE_2D,0,4,checkImageWidth,
checkImageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,
&checkImage[0][0][0]);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glBindTexture(GL_TEXTURE_2D,1); glColor3f(0.8,0.0,0.8);
glTexCoord2f(0.0,0.0);
glVertex3f(-2.0,-2.0,0.0);
glTexCoord2f(0.0,1.0);
glVertex3f(-2.0,2.0,0.0);
glTexCoord2f(1.0,1.0);
glVertex3f(2.0,2.0,0.0);
glTexCoord2f(1.0,0.0);
glVertex3f(2.0,-2.0,0.0);
glEnable(GL_TEXTURE_2D);
UpdateData(true); glFinish();
}
void COrbitView::makeTexture()
{
int i, j;
FILE *fp;
unsigned char *image;
int rc; fp = fopen("globe.bmp","rb");
if(!fp) return;
fseek(fp,54,SEEK_SET);
image = (unsigned char *)malloc(checkImageWidth*checkImageWidth*4);
rc=fread(image,sizeof(unsigned char),checkImageWidth*checkImageWidth*4,fp);
fclose(fp);
for(i=0; i<checkImageWidth; i++)
{
for(j=0; j<checkImageWidth; j++)
{
checkImage[i][j][2] = (GLubyte) *(image+i*checkImageWidth*3+j*3);
checkImage[i][j][1] = (GLubyte) *(image+i*checkImageWidth*3+j*3+1);
checkImage[i][j][0] = (GLubyte) *(image+i*checkImageWidth*3+j*3+2);
checkImage[i][j][3] = (GLubyte)255;
}
}
}
“globe.bmp”是一张地球位图
我想要贴完纹理的地球是个三维的球体,因为我还要让它旋转起来。
还有问题就是,读.bmp文件,怎么能够取到有用的图片信息。我上面的这种读法是不是把文件头信息,文件头,都读进来了?
fp = fopen("globe.bmp","rb");
if(!fp) return;
fseek(fp,54,SEEK_SET);
我不明白为什么要偏移54。
我是刚开始学OPENGL,觉得里面的函数好多,但是都不知道
我觉得我的问题好像出在文理坐标定义上。大家帮帮忙呀!