加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – OpenGL ES – glDrawElements – 麻烦理解指数

发布时间:2020-12-14 19:52:47 所属栏目:百科 来源:网络整理
导读:我想知道是否有人可以帮助我理解指数如何与glDrawElements一起使用.在下面的例子中(取自 http://www.everita.com/lightwave-collada-and-opengles-on-the-iphone),作者提到在这种情况下你只能有一组索引 const GLushort tigerBottomIndices[] = {0,1,2,3,4,5
我想知道是否有人可以帮助我理解指数如何与glDrawElements一起使用.在下面的例子中(取自 http://www.everita.com/lightwave-collada-and-opengles-on-the-iphone),作者提到在这种情况下你只能有一组索引

const GLushort tigerBottomIndices[] = {
0,1,2,3,4,5,6,…

};

我的问题是这些指数描述了什么?我是否正确地认为前三个是顶点位置,后三个是相应的法线,后三个是纹理合并?

提前致谢 !

#import "OpenGLCommon.h"

const Vertex3D tigerBottomPositions[] = {
{0.176567,0.143711,0.264963},{0.176567,0.137939,0.177312},{0.198811,0.135518,0.179324},…
};
const Vertex3D tigerBottomNormals[] = {
{-0.425880,-0.327633,0.350967},{-0.480159,-0.592888,0.042138},{-0.113803,-0.991356,0.065283},…
};
const GLfloat tigerBottomTextureCoords[] = {
0.867291,0.359728,0.779855,0.359494,0.781798,0.337223,…
};
const GLushort tigerBottomIndices[] = {
0,…
};

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);    

glBindTexture(GL_TEXTURE_2D,tigerTextures[5]);
glVertexPointer(3,GL_FLOAT,tigerBottomPositions);
glNormalPointer(GL_FLOAT,tigerBottomNormals);
glTexCoordPointer(2,tigerBottomTextureCoords);
glDrawElements(GL_TRIANGLES,210,GL_UNSIGNED_SHORT,tigerBottomIndices);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableEnableClientState(GL_TEXTURE_COORD_ARRAY);

解决方法

索引数组中的每个值同时指向位置,法线和纹理坐标.

它们只是以3个为一组进行组织,因为它们只是描述三角形的顶点,所以3个顶点当然是1个三角形.

const GLushort tigerBottomIndices[] = {
0,// #1 Triangle
3,// #2 Triangle
1,// #3 Triangle
…

所以让我们选择这些指数的第一个值,它是0.

这意味着:

选择顶点位置编号0

另外,选择顶点法线数0

并选择纹理坐标编号0

const Vertex3D tigerBottomPositions[] = {
{0.176567,// This is the position number 0
{0.176567,// This is the normal number 0
{-0.480159,// These are the tex-coords number 0
0.779855,…
};

因此,此信息将发送到顶点着色器:

VertexPosition:0.176567,0.264963

VertexNormal:-0.425880,0.350967

VertexTextureCoordinates:0.867291,0.359728

如果你不使用索引,opengl会线性发送这些顶点数据,所以在发送顶点数据0后,它会发送数据位置1的数据,然后是2,4等…

这很好,但有时你的三角形最终会有一个或两个相同的顶点.考虑一下:

你可以看到2个三角形形成一个正方形,它们有两个共同的顶点,0和2.所以我们只有4个,2个traingles使用相同的数据,而不是6个顶点,每个三角形为3个.顶点.这对性能有好处,特别是当您拥有包含数百个三角形的大型模型时.

为了绘制第一个三角形,我们需要顶点编号0,1和2,而对于第二个三角形,2和3.

看看,没有索引数组,opengl会尝试使用顶点0,1和2(第一个三角形可以)但是对于第二个三角形,opengl会查找顶点3,4和5.这是错误的.

这就是我们创建索引数组的原因,因此opengl可以为顶点着色器发送正确的顶点.在我们的例子中,我们的索引数组看起来像这样:

const GLushort tigerBottomIndices[] = {
0,}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读