unsigned int m_texture[10]; // 纹理
AUX_RGBImageRec* LoadBMP(char *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供。
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename,"r"); // 尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoadA(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}
int LoadGLTextures ( char* filename, unsigned int idx )
{
int status = FALSE; // 状态指示器
AUX_RGBImageRec* textureImage[1]; // 创建纹理的存储空间
memset( textureImage, 0, sizeof(void*)*1 ); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出
if ( textureImage[0] = LoadBMP( filename ) )
{
status = TRUE; // 将 Status 设为 TRUE
glGenTextures( 1, &m_texture[idx] ); // 创建纹理
// 使用来自位图数据生成 的典型纹理
glBindTexture( GL_TEXTURE_2D, m_texture[idx] );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB,textureImage[0]->sizeX, textureImage[0]->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE, textureImage[0]->data );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
}
if ( textureImage[0] )// 纹理是否存在
{
if ( textureImage[0]->data )// 纹理图像是否存在
{
free( textureImage[0]->data );// 释放纹理图像占用的内存
}
free( textureImage[0] ); // 释放图像结构
}
return status;
}
void OnInitialUpdate()
{
CView::OnInitialUpdate();
if ( FALSE == LoadGLTextures("D:\\data\\ex.bmp", 0))
AfxMessageBox( "无法加载纹理ex.bmp" );
glBindTexture( GL_TEXTURE_2D, m_texture[0] );
}
From MSDN (and presumably the OpenGL 1.1 Man pages) under glBegin()/glEnd()
quote:
You can use only a subset of OpenGL functions between glBegin and glEnd. The functions you can use are:
glVertex
glColor
glIndex
glNormal
glTexCoord
glEvalCoord
glEvalPoint
glMaterial
glEdgeFlag
From the glBindTexture page in the error codes section:
GL_INVALID_OPERATION glBindTexture was called between a call to glBegin and the corresponding call to glEnd.
所以,在RenderScene()中,我们应该这样写:
void CSampleView::RenderScene ()
{
glPushMatrix();
{
glBindTexture(GL_TEXTURE_2D, m_texture[0]); // 选择纹理
// 绘制物体
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glEnd();
glBindTexture(GL_TEXTURE_2D, m_texture[1]);
glBegin(GL_QUADS);
// 后面
glTexCoord2f(1.0f, 0.0f);glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glEnd();
glBindTexture(GL_TEXTURE_2D, m_texture[2]);
glBegin(GL_QUADS);
// 顶面
glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glEnd();
glBindTexture(GL_TEXTURE_2D, m_texture[3]);
glBegin(GL_QUADS);
// 右面
glTexCoord2f(1.0f, 0.0f);glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glEnd();
}
glPopMatrix();
}
上面的立方体可以用下面的方法优化一下:
typedef
{
float
}face;
//
typedef
face
}cube
for(int
{
glBindTexture(GL_TEXTURE_2D,...);
glBegin(GL_QUADS);
glVertex3fv(&cube.faces.p1);
glVertex3fv(&cube.faces[i].p2);
glVertex3fv(&cube.faces[i].p3);
glVertex3fv(&cube.faces[i].p4);
glEnd();
}