Java 如何在由六个三角形条组成的矩形上显示纹理(opengl es)

Java 如何在由六个三角形条组成的矩形上显示纹理(opengl es),java,android,opengl-es,Java,Android,Opengl Es,我正在寻找OpenGLES2.0的帮助。每次我尝试对由4个以上三角形组成的矩形进行纹理处理时,第二次和下一次重复的纹理都会被破坏。我的意思是,它被拉伸了。如下图所示 拉伸示例: 我在互联网上寻找这个问题的解决方案,但没有任何帮助。我想这可能是纹理坐标或绘图的问题 三角形类 public advancedRect(){ 顶点=新浮点[]{ -2, 1, 0, //0 -2, -1, 0, //1 0, -1, 0, //2 0, 1, 0, //3 2, 1, 0, //4 2, -1, 0 /

我正在寻找OpenGLES2.0的帮助。每次我尝试对由4个以上三角形组成的矩形进行纹理处理时,第二次和下一次重复的纹理都会被破坏。我的意思是,它被拉伸了。如下图所示

拉伸示例:

我在互联网上寻找这个问题的解决方案,但没有任何帮助。我想这可能是纹理坐标或绘图的问题

三角形类

public advancedRect(){
顶点=新浮点[]{
-2, 1, 0, //0
-2, -1, 0, //1
0, -1, 0, //2
0, 1, 0, //3
2, 1, 0, //4
2, -1, 0 //5
};
texCoords=ARECT.texCoords;
texBuffer=setFloatBuffer(新浮点[]{
0,0,
0,1,
1,1,
1,0,
0,0,
1,1
});
orderBuffer=setShortBuffer(新短[]{
0, 1, 3, 2, 4, 5
});
verticesAmount=6;
objBuffer=setFloatBuffer(顶点);
}
我就是这样画画的

public void draw(float[]vPMatrix,int程序)
{
setHandlers(程序);
float[]scratch=rotator.rotate(vPMatrix);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texDataHandle);
GLES20.GlenableVertexAttributeArray(位置手柄);
GLES20.GlvertexAttribute指针(
位置手柄,
OBJ3D.VERTICEVERTEX,
GLES20.GL_浮动,
OBJ3D.NORMALIZED,
OBJ3D.STRIDE,
奥布布弗
);
GLES20.GlenableVertexAttributeArray(texCoordHandle);
GLES20.GlvertexAttribute指针(
texCoordHandle,
OBJ3D.TEXVERTEX,
GLES20.GL_浮动,
OBJ3D.NORMALIZED,
0,
texBuffer
);
GLES20.glUniform1f(xModifierHandle,xModifier);
GLES20.glUniform1f(yModifierHandle,yModifier);
GLES20.glUniformMatrix4fv(
vPMatrixHandle,
OBJ3D.COUNT,
OBJ3D.TRANSPOSE,
划痕
OBJ3D.OFFSET
);
GLES20.GldUnderElements(
GLES20.GL_三角形_带,
verticesAmount,
GLES20.GL_无符号_短,
订单缓冲区
);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glUniform1i(texUniformHandle,OBJ3D.X);
GLES20.GLDisableVertexAttributeArray(texCoordHandle);
GLES20.GLDisableVertexAttributeArray(位置句柄);
}

注意,中间的点必须与V坐标1相关联,因为它是左纹理的右边界。但它们也必须与v坐标0相关联,因为下一个矩形从该点开始,因此它也是右纹理的左边界

(-2,1)(0,1)(2,1)
+----+----+
|   /|   /|
|  / |  / |
| /  | /  |
|/   |/   |
+----+----+
(-2, -1)  (0, -1)  (2, -1)
(0,0)(1,0)(0,0)(1,0)
+----+              +----+
|   /|              |   /|
|  / |              |  / |
| /  |              | /  |
|/   |              |/   |
+----+              +----+
(0, 1)     (1, 1)   (0, 1)      (1, 1)
要实现所需,还必须增加纹理坐标:

顶点=新浮点[]{
-2,  1, 0, // 0
-2, -1, 0, // 1
0,  1, 0, // 2
0, -1, 0, // 3
2,  1, 0, // 4
2, -1, 0  // 5
};
texBuffer=setFloatBuffer(新浮点[]{
0, 0,
0, 1,
1, 0,
1, 1,
2, 0,
2, 1
});
orderBuffer=setShortBuffer(新短[]{
0, 1, 2, 3, 4, 5
});
注意,现在第一个纹理矩形的v坐标在范围[0,1]内,第二个纹理矩形的v坐标在范围[1,2]内

(0,0)(0,1)(0,2)
+----+----+
|   /|   /|
|  / |  / |
| /  | /  |
|/   |/   |
+----+----+
(0, 1)  (1, 1)  (1, 2)
纹理参数
GL\u texture\u WRAP\T
必须设置为
GL\u REPEAT
,才能进行此操作。看

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texDataHandle);
GLES20.glTexParameteri(GLES20.GL_纹理2D、GLES20.GL_纹理包裹、GLES20.GL_重复);

注意,中间的点必须与V坐标1相关联,因为它是左纹理的右边界。但它们也必须与v坐标0相关联,因为下一个矩形从该点开始,因此它也是右纹理的左边界

(-2,1)(0,1)(2,1)
+----+----+
|   /|   /|
|  / |  / |
| /  | /  |
|/   |/   |
+----+----+
(-2, -1)  (0, -1)  (2, -1)
(0,0)(1,0)(0,0)(1,0)
+----+              +----+
|   /|              |   /|
|  / |              |  / |
| /  |              | /  |
|/   |              |/   |
+----+              +----+
(0, 1)     (1, 1)   (0, 1)      (1, 1)
要实现所需,还必须增加纹理坐标:

顶点=新浮点[]{
-2,  1, 0, // 0
-2, -1, 0, // 1
0,  1, 0, // 2
0, -1, 0, // 3
2,  1, 0, // 4
2, -1, 0  // 5
};
texBuffer=setFloatBuffer(新浮点[]{
0, 0,
0, 1,
1, 0,
1, 1,
2, 0,
2, 1
});
orderBuffer=setShortBuffer(新短[]{
0, 1, 2, 3, 4, 5
});
注意,现在第一个纹理矩形的v坐标在范围[0,1]内,第二个纹理矩形的v坐标在范围[1,2]内

(0,0)(0,1)(0,2)
+----+----+
|   /|   /|
|  / |  / |
| /  | /  |
|/   |/   |
+----+----+
(0, 1)  (1, 1)  (1, 2)
纹理参数
GL\u texture\u WRAP\T
必须设置为
GL\u REPEAT
,才能进行此操作。看

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texDataHandle);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,GLES20.G