纹理贴图 小结

1.之前学习的时候,对比较简单的几何体,例如立方体等贴图很容易。

步骤为:先加载纹理图片,然后在Draw()函数里面写一个绑定语句,形如:  glBindTexture(GL_TEXTURE_2D, texture[1]);接着绘制图形(如:立方体),同时写明纹理坐标和立方体坐标,它们之间是一一对应的关系,这样立方体上就出现了纹理。

2.后来,学习了球体贴图。

步骤为:最开始要创建并返回一个指向g_text二次对象的指针GLUquadricObj* g_text= gluNewQuadric();接着就加载纹理图片,然后再Draw()函数里面写一个绑定语句 glBindTexture(GL_TEXTURE_2D, texture[1]);再接着就是最重要的绘制球并贴上纹理gluSphere(g_text, 1.0f, 128, 128);  这里就不需要一一写明纹理坐标和球体坐标了,也会出现纹理。

3.现在,学习了给平面圆贴图。

步骤为:这里开始的步骤和立方体中的很类似,只是对于圆柱体,我们没有现成的函数可以直接绘制,必须要组合,包括一个没有盖的圆筒和两个平面圆,要想在平面圆上显示纹理,我们似乎没有办法一个个坐标计算,也不能用球体的方法贴图。我们应该怎么做了?以下就是在画圆的时候直接把贴图绑定,然后写一个绘制封闭圆柱体的函数,最后在Draw()函数中直接调用绘制圆柱体的函数,这样,圆柱体的平面圆上就会有我们的贴图了。嘿嘿~~~


 GLvoid draw_circle(const GLfloat radius,const GLuint num_vertex)
{
GLfloat vertex[4]; 
GLfloat texcoord[2];
const GLfloat delta_angle = 2.0*M_PI/num_vertex;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texName);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glBegin(GL_TRIANGLE_FAN);
//draw the vertex at the center of the circle
texcoord[0] = 0.5;
texcoord[1] = 0.5;
glTexCoord2fv(texcoord);
vertex[0] = vertex[1] = vertex[2] = 0.0;
vertex[3] = 1.0;        
glVertex4fv(vertex);
//draw the vertex on the contour of the circle
for(int i = 0; i < num_vertex ; i++)
{
texcoord[0] = (std::cos(delta_angle*i) + 1.0)*0.5;
texcoord[1] = (std::sin(delta_angle*i) + 1.0)*0.5;
glTexCoord2fv(texcoord);


vertex[0] = std::cos(delta_angle*i) * radius;
vertex[1] = std::sin(delta_angle*i) * radius;
vertex[2] = 0.0;
vertex[3] = 1.0;
glVertex4fv(vertex);
}

texcoord[0] = (1.0 + 1.0)*0.5;
texcoord[1] = (0.0 + 1.0)*0.5;
glTexCoord2fv(texcoord);

vertex[0] = 1.0 * radius;
vertex[1] = 0.0 * radius;
vertex[2] = 0.0;
vertex[3] = 1.0;
glVertex4fv(vertex);
glEnd();

glDisable(GL_TEXTURE_2D);
}

之前一直以为是只要在Draw()函数中绘制圆柱体的地方,绑定纹理就可以了,可是一直只有一个效果,只有底色没有上面的图案。看来对于组合的物体,不是很规则的物体,我们还是要进行坐标的一一对应。不能简单的以为绑定纹理,开启纹理就万事大吉了~~手工小车完成了。






你可能感兴趣的:(图形学)