c++ - 重复纹理问题

标签 c++ c opengl nurbs

我正在尝试将图像映射到 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 次,即我有 4 个 1x1 纹理而不是 2x2 纹理。

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

最佳答案

纹理的坐标范围为[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. */

关于c++ - 重复纹理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204007/

相关文章:

C打印进度条

c - 基本堆栈中的内存泄漏

c++ - Qt:父子关系如何影响子部件的布局?

c++ - 在 C++ 控制台中将文本右对齐

C++ 写();反向写入给定的字节值

c++ - 如何在 Windows 上为 C/C++ 中的文件预先分配空间?

c++ - glPushMatrix() 和 glBegin() 之间有联系吗?

c++ - 如何将字符串转换为long long

c - TCL GUI 在 Windows 上查看 "native"有哪些选项?

opengl - opengl中的顶点缓冲区