纹理和纹理映射GLUTess多边形?

时间:2010-05-23 19:43:16

标签: c++ c opengl

如何提供纹理坐标并为GLUTess多边形绑定纹理? 感谢

2 个答案:

答案 0 :(得分:1)

我不知道如果我正确地告诉你。纹理在redbook中有很好的描述。 他们在书中使用了GLUT,所以你应该在例子中找到答案。

简而言之:在调用glVertex之前调用glTexCoord2f(u,v)(如果你不使用VBO),其中u,v是纹理坐标。

HTH

编辑: 对不起,现在我明白了这个问题。

我从未使用过tesselators,但也许我可以提供帮助: - )

Tesselators只找到应该创建新顶点的点。标准glVertex用于将它们发送到GPU。

您可以使用自己的函数绘制顶点。如果您使用

注册回调
gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid (*) ()) &vertexCallback); 

然后每次创建新顶点时调用您的函数。您也可以使用

gluTessCallback(tobj, GLU_TESS_COMBINE, (GLvoid (*) ()) &combineCallback);

向顶点添加一些信息 - 如法线,颜色,tex坐标。

参见redbook - chapter11示例11-2

/*  a different portion of init() */
   gluTessCallback(tobj, GLU_TESS_VERTEX,
                   (GLvoid (*) ()) &vertexCallback);
   gluTessCallback(tobj, GLU_TESS_BEGIN,
                   (GLvoid (*) ()) &beginCallback);
   gluTessCallback(tobj, GLU_TESS_END,
                   (GLvoid (*) ()) &endCallback);
   gluTessCallback(tobj, GLU_TESS_ERROR,
                   (GLvoid (*) ()) &errorCallback);
   gluTessCallback(tobj, GLU_TESS_COMBINE,
                   (GLvoid (*) ()) &combineCallback);

/*  new callback routines registered by these calls */
void vertexCallback(GLvoid *vertex)
{
   const GLdouble *pointer;

   pointer = (GLdouble *) vertex;
   glColor3dv(pointer+3);
   glVertex3dv(vertex);
}

void combineCallback(GLdouble coords[3], 
                     GLdouble *vertex_data[4],
                     GLfloat weight[4], GLdouble **dataOut )
{
   GLdouble *vertex;
   int i;

   vertex = (GLdouble *) malloc(6 * sizeof(GLdouble));
   vertex[0] = coords[0];
   vertex[1] = coords[1];
   vertex[2] = coords[2];
   for (i = 3; i < 7; i++)
      vertex[i] = weight[0] * vertex_data[0][i] 
                  + weight[1] * vertex_data[1][i]
                  + weight[2] * vertex_data[2][i] 
                  + weight[3] * vertex_data[3][i];
   *dataOut = vertex;
}

通常用纹理来绑定纹理就足够了 - 在用tesselator绘图之前做它。

HTH

答案 1 :(得分:0)

曲面细分器应根据从中派生的顶点插入纹理坐标。另一种方法是使用自动纹理坐标生成,如果适用于该情况。