代码之家  ›  专栏  ›  技术社区  ›  Zelig63

打开的gl es中矩形上纹理的映射不正确

  •  0
  • Zelig63  · 技术社区  · 7 年前

    矩形的顶点定义如下:

    0------1
    |      |
    |      |
    2------3
    

    该矩形由以下两个三角形建模:0、2、3和0、3、1。

    然后将六个顶点的列表映射到纹理坐标,如下所示:

    0.0f,0.0f
    0.0f,1.0f
    1.0f,1.0f
    0.0f,0.0f
    1.0f,1.0f
    1.0f,0.0f
    

    但是纹理没有正确映射…

    我的纹理图像在那里:

    enter image description here

    我在屏幕上看到的结果是:

    enter image description here

    有人看到我搞砸了吗?

    我将纹理传输到打开GL的方式:

        pointeurSurTexture = GLES31.glGetUniformLocation(programme, "texture");
        pointeurSurCoordonnéesTexture = GLES31.glGetAttribLocation(programme, "coordonneesTexture");
    
        GLES31.glActiveTexture(GLES31.GL_TEXTURE0);
        GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, pointeursSurTextures[0]);
        GLES31.glUniform1i(pointeurSurTexture, 0);
        GLES31.glVertexAttribPointer(pointeurSurCoordonnéesTexture, NB_COORDONNEES_PAR_POINT_TEXTURE2D,
                GLES31.GL_FLOAT, false,NB_COORDONNEES_PAR_POINT_TEXTURE2D*OCTETS_PAR_FLOAT,
                tableauCoordonnéesTextures);
        GLES31.glEnableVertexAttribArray(pointeurSurCoordonnéesTexture);
    

    我的片段着色程序:

            precision mediump float;
            uniform sampler2D texture;
            varying vec4 couleurSommet;
            varying vec2 coordonneeTexture;
            void main() {
                gl_FragColor = couleurSommet *  texture2D(texture,coordonneeTexture);
            };
    

    以及如何绘制三角形:

    GLES31.glDrawElements(GL_TRIANGLES, triangles.capacity(),GL_UNSIGNED_SHORT, triangles);
    

    这个 triangles 数组包含三角形的坐标,表示为顶点索引(例如0,2,3,0,3,1)。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Rabbid76    7 年前

    当你打电话 glDrawElements 然后根据元素索引数组中的索引查找顶点坐标。
    但是所有其他属性,比如纹理坐标,也会被查找。

    您定义了4个顶点坐标,它们形成一个四元宽度 w 和一个高度 h :

    0------1
    |      |
    |      |
    2------3
    
       x  y
    0: 0  0
    1: w  0
    2: 0  h
    3: w  h
    

    四边形由2个三角形绘制

    该矩形由以下两个三角形建模:0、2、3和0、3、1。

    […]

    GLES31.glDrawElements(GL_TRIANGLES, triangles.capacity(),GL_UNSIGNED_SHORT, triangles);
    

    三角形数组包含三角形的坐标,表示为顶点索引(例如0,2,3,0,3,1)。

    所以你已经设置了一个由4个顶点坐标和6个索引组成的数组。

    如果要添加纹理坐标,则必须将每个顶点坐标关联到相应的纹理坐标,而不是索引数组的每个元素!
    顶点坐标和纹理坐标的数量必须相等,但不能等于纹理坐标属性的数量和索引数组中的元素数量。

    顶点坐标和纹理及其属性(在本例中是纹理坐标)构成一组数据。可以将二维顶点坐标(x,y)和二维纹理坐标视为单个4维坐标。

       x  y  u  v
    0: 0  0  0  0
    1: w  0  1  0
    2: 0  h  0  1
    3: w  h  1  1
    

    这意味着属性 "texture" 必须按以下顺序与4个纹理坐标数组关联:

    0, 0, 1, 0, 0, 1, 1, 1