【发布时间】:2016-05-09 07:48:32
【问题描述】:
我尝试在 100x100 的矩形内平铺大小为 16x16 的纹理。我将GL_TEXTURE_WRAP_S 和GL_TEXTURE_WRAP_T 设置为GL_REPEAT,但它没有任何效果(见下图)。如何正确平铺图像?我应该使用不同的方法来绘制而不是glDrawArrays吗?
原始纹理 16x16
实际结果:
代码:
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture.getId());
glTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// GL_REPEAT
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glPushMatrix();
glVertexPointer(VERTEX_POINTER_COUNT, GL_FLOAT, 0, vertexPointer);
glColorPointer(COLOR_POINTER_COUNT, GL_FLOAT, 0, colorPointer);
glTexCoordPointer(TEXTURE_COORD_POINTER_COUNT, GL_FLOAT, 0, texCoordPointer);
glDrawArrays(GL_TRIANGLES, 0, 6);
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, NULL_ID);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_BLEND);
更新。
// Texture coordinates
private float[] uv = new float[]{0, 0, 0, 1, 1, 1, 1, 0};
public final FloatBuffer texCoordPointer = BufferUtils.createFloatBuffer(2 * 3 * 2 * 2);
texCoordPointer.clear();
texCoordPointer.put(uv[0]).put(uv[1]);
texCoordPointer.put(uv[2]).put(uv[3]);
texCoordPointer.put(uv[4]).put(uv[5]);
texCoordPointer.put(uv[0]).put(uv[1]);
texCoordPointer.put(uv[4]).put(uv[5]);
texCoordPointer.put(uv[6]).put(uv[7]);
texCoordPointer.flip();
【问题讨论】:
-
你的纹理坐标范围是多少?
-
@KolesnikovichDmitry:他说的是“纹理坐标”,而不是位置。
texCoordPointer中的内容,而不是vertexPointer中的内容。 -
@RetoKoradi 请查看有问题的 UPD
-
你做得对,但描述不正确。 “我将
GL_REPEAT设置为GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T。” 实际上,您将 S 和 T 环绕状态设置为重复,而不是相反。 -
@AndonM.Coleman 感谢修复