2011-11-20 63 views
2

我想将图像映射到NURBS曲面上。我在(-1,-1),(-1,1),(1,1),(1,-1)平方中有一个13x13的等距控制点阵列。我想一个纹理映射到通过使用下面的代码的控制点控制的NURBS曲面:重复纹理问题

gluNurbsSurface(nurbs_object,no_knots,&knots[0],no_knots,&knots[0],u_stride,v_stride,&ctr_points[0][0],u_order,v_order,GL_MAP2_TEXTURE_COORD_2); 
gluNurbsSurface(nurbs_object,no_knots,&knots[0],no_knots,&knots[0],u_stride,v_stride,&ctr_points[0][0],u_order,v_order,GL_MAP2_VERTEX_3); 
gluNurbsSurface(nurbs_object,no_knots,&knots[0],no_knots,&knots[0],u_stride,v_stride,&ctr_points[0][0],u_order,v_order,GL_MAP2_NORMAL); 

以下是我初始化我的程序与参数:

gluNurbsProperty(nurbs_object, GLU_SAMPLING_TOLERANCE, 50.0); 
gluNurbsProperty(nurbs_object, GLU_DISPLAY_MODE, GLU_FILL); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image_width, image_height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 

这个问题我我所面对的是,我在原点周围重复4次纹理图像,而不是2x2纹理,我有4个1x1纹理。

我哪里错了?我该如何解决它?

回答

1

该纹理的坐标范围为[0,0] - > [1,1]。由于默认纹理环绕设置为GL_REPEAT,因此使用的坐标会产生您观察到的2x2平铺。

编辑:

你需要扩展用于纹理坐标NURBS曲面,或缩放纹理坐标一些其他的方式。后者可能侵扰性较小:

GLint mmode; 

glGetIntegerv(GL_MATRIX_MODE, & mmode); /* save active matrix stack. */ 
glMatrixMode(GL_TEXTURE); 
glPushMatrix(); 
glLoadIdentity(); 
glScalef(0.5, 0.5, 1.0); 

/* ... draw ... */ 

glPopMatrix(); 
glMatrixMode((GLenum) mmode); /* restore active matrix stack. */ 
+0

我该如何解决它? – Anand