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

Posted

技术标签:

【中文标题】纹理和纹理映射 GLUTess 多边形?【英文标题】:Texturing and Texture Mapping GLUTess Polygons? 【发布时间】:2010-05-23 19:43:15 【问题描述】:

究竟如何为 GLUTess 多边形提供纹理坐标和绑定纹理? 谢谢

【问题讨论】:

【参考方案1】:

我不知道我是否理解正确。纹理在redbook 中有很好的描述。 他们在书中使用了 GLUT,因此您应该在示例中找到答案。

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

HTH

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

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

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

【讨论】:

但是当您使用 GLUTess 时,您无法在每个顶点之前进行调用,因此是我的问题【参考方案2】:

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

【讨论】:

以上是关于纹理和纹理映射 GLUTess 多边形?的主要内容,如果未能解决你的问题,请参考以下文章

更改纹理大小时是不是必须重新映射 UV?

opengl使用bmp纹理映射画不出东西

多边形和方形纹理的纹理坐标

在 OpenGL 中重复纹理

使用 OpenGL 和 QT 进行纹理映射 - C++

大量相同纹理的四边形