2010-05-23 58 views

回答

1

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

简而言之:在调用glVertex(如果不使用VBO)之前调用glTexCoord2f(u,v),其中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; 
} 

这应足以为通常结合质感 - 与tesselators绘制之前做到这一点。

HTH

+0

但是,当你使用GLUTess你不能在每个顶点之前打电话,因此我的问题 – jmasterx 2010-05-23 22:01:51

0

的镶嵌应该插值纹理坐标根据它来源于顶点。另一种方法是使用自动纹理坐标生成,如果它适用于这种情况。