Open GL ES中

时间:2019-02-10 08:45:25

标签: java android opengl-es

我的矩形的顶点定义如下:

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

有人看到我在搞砸吗?

我将纹理传输到Open 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 个答案:

答案 0 :(得分:0)

调用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);
     

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

因此,您设置了一个包含4个顶点坐标的数组和一个包含6个索引的数组。

要添加纹理坐标时,则必须将每个顶点坐标与一个对应的纹理坐标关联,而不是将索引数组的每个元素关联起来!
顶点坐标和纹理坐标的数量必须相等,但纹理坐标属性的数量和索引数组中元素的数量必须不相等。

顶点坐标和纹理及其属性(在这种情况下为纹理坐标)形成一组数据。您可以将2维顶点坐标(x,y)和2维纹理坐标视为一个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