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

问题描述 投票:0回答:1

我正在寻求有关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);
}
java android opengl opengl-es
1个回答
0
投票

注意,右边的点必须与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
© www.soinside.com 2019 - 2024. All rights reserved.