【问题标题】:Incorrect mapping of a texture on a rectanlge in Open GL ES在 Open GL ES 中矩形上的纹理映射不正确
【发布时间】:2019-02-10 08:45:24
【问题描述】:

我的矩形的顶点是这样定义的:

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

但是纹理没有正确映射...

我的纹理图像在那里:

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

有人知道我在哪里搞砸了吗?

我将纹理传输到 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)。

【问题讨论】:

  • 您应该发布一些代码以帮助人们更好地理解您的代码,但是从外观上看,您的纹理没有任何问题,它似乎是重复/镜像的,因此您需要制作纹理如果您不想要那种效果,请不要重复
  • 这几乎不清楚。坐标列表是顶点坐标列表还是纹理坐标列表?你有 4 个顶点坐标和 6 个索引来绘制四边形吗?如果是,那么您也需要 4 个 uv 坐标。按以下顺序:0 - 0.0f,0.0f 1 - 0.0f,1.0f 2 - 1.0f,0.0f 3 - 1.0f,1.0f。但没有任何代码我只能猜测。
  • 纹理坐标列表链接到三角形顶点:我的矩形的顶点 0、2 和 3 构成的第一个三角形应该映射到前三个纹理坐标 (0,0; 0,1; 1,1) 和第二个,使用顶点 0,3 和 1 到最后三个纹理坐标 (0,0; ​​1,1; 1,0)。
  • 这不能回答我的问题。你用glDrawElements还是glDrawArrays
  • 添加了一些代码来帮助你。

标签: java android opengl-es


【解决方案1】:

当您调用glDrawElements 时,会通过元素索引数组中的索引查找顶点坐标。
但是所有其他属性,如纹理坐标,也会被查找。

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

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

四边形由两个三角形绘制

这个矩形用以下两个三角形建模: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

【讨论】:

  • 再次感谢 Rabbid76 提供的这个非常清晰和全面的答案。我的纹理现在完美地应用在我的矩形上。
猜你喜欢
  • 1970-01-01
  • 2020-12-15
  • 2023-03-08
  • 2012-07-29
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多