Open GL ES 中矩形上的纹理映射不正确
Incorrect mapping of a texture on a rectanlge in Open GL 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
但是贴图没有正确映射...
我的纹理图像在那里:
我在屏幕上得到的结果是:
有人看到我哪里搞砸了吗?
我将纹理传输到 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)。
当您调用 glDrawElements
时,顶点坐标由元素索引数组中的索引查找。
但是所有其他属性,如纹理坐标,也会被查找。
您定义了 4 个顶点坐标,形成宽度 w
高度 h
的四边形:
0------1
| |
| |
2------3
x y
0: 0 0
1: w 0
2: 0 h
3: w h
四边形由 2 个三角形绘制
This rectangle is modelized with the two following triangles : 0,2,3 and 0,3,1.
[...]
GLES31.glDrawElements(GL_TRIANGLES, triangles.capacity(),GL_UNSIGNED_SHORT, triangles);
The triangles array contains the triangle's coordinate, expressed as vertex indexes (e.g 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
我的矩形顶点定义如下:
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)。
当您调用 glDrawElements
时,顶点坐标由元素索引数组中的索引查找。
但是所有其他属性,如纹理坐标,也会被查找。
您定义了 4 个顶点坐标,形成宽度 w
高度 h
的四边形:
0------1 | | | | 2------3
x y
0: 0 0
1: w 0
2: 0 h
3: w h
四边形由 2 个三角形绘制
This rectangle is modelized with the two following triangles : 0,2,3 and 0,3,1.
[...]
GLES31.glDrawElements(GL_TRIANGLES, triangles.capacity(),GL_UNSIGNED_SHORT, triangles);
The triangles array contains the triangle's coordinate, expressed as vertex indexes (e.g 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