我正在寻求有关OpenGL ES 2.0的帮助。每次当我尝试对由4个以上的三角形组成的矩形进行纹理处理时,第二个和下一个重复的纹理都会中断。我的意思是,它伸展了。就像下面的图片一样。
我一直在互联网上寻求解决方案,但这无济于事。我认为纹理坐标或绘图可能存在问题。
三角形类别
public AdvencedRect(){
vertices = new float[]{
-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(new float[]{
0,0,
0,1,
1,1,
1,0,
0,0,
1,1
});
orderBuffer = setShortBuffer(new short[]{
0, 1, 3, 2, 4, 5
});
verticesAmount = 6;
objBuffer = setFloatBuffer(vertices);
}
我是怎么画的
public void draw(float[] vPMatrix, int program)
{
setHandlers(program);
float[] scratch = rotator.rotate(vPMatrix);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texDataHandle);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glVertexAttribPointer(
positionHandle,
OBJ3D.VERTICEVERTEX,
GLES20.GL_FLOAT,
OBJ3D.NORMALIZED,
OBJ3D.STRIDE,
objBuffer
);
GLES20.glEnableVertexAttribArray(texCoordHandle);
GLES20.glVertexAttribPointer(
texCoordHandle,
OBJ3D.TEXVERTEX,
GLES20.GL_FLOAT,
OBJ3D.NORMALIZED,
0,
texBuffer
);
GLES20.glUniform1f(xModifierHandle, xModifier);
GLES20.glUniform1f(yModifierHandle, yModifier);
GLES20.glUniformMatrix4fv(
vPMatrixHandle,
OBJ3D.COUNT,
OBJ3D.TRANSPOSE,
scratch,
OBJ3D.OFFSET
);
GLES20.glDrawElements(
GLES20.GL_TRIANGLE_STRIP,
verticesAmount,
GLES20.GL_UNSIGNED_SHORT,
orderBuffer
);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glUniform1i(texUniformHandle, OBJ3D.X);
GLES20.glDisableVertexAttribArray(texCoordHandle);
GLES20.glDisableVertexAttribArray(positionHandle);
}
注意,右边的点必须与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)
要达到您想要的效果,您还必须增加纹理坐标:
vertices = new float[]{
-2, 1, 0, // 0
-2, -1, 0, // 1
0, 1, 0, // 2
0, -1, 0, // 3
2, 1, 0, // 6
2, -1, 0 // 7
};
texBuffer = setFloatBuffer(new float[]{
0, 0,
0, 1,
1, 0,
1, 1,
2, 0,
2, 1
});
orderBuffer = setShortBuffer(new short[]{
0, 1, 2, 3, 4, 5
});
注意,现在第一个纹理矩形的v坐标在[0,1]范围内,而第二个纹理矩形的坐标在[1,2]范围内。必须将纹理参数GL_TEXTURE_WRAP_T
设置为GL_REPEAT
才能执行此操作。参见glTexParameter
。
glTexParameter