在opengl-es 2.0中,每个顶点可能有多个法线

时间:2012-07-09 15:08:18

标签: objective-c ios opengl-es

目前我的模型每个顶点使用一个法线,但这等同于模型在光照方面看起来是圆的,这是不理想的,因为我的模型意味着有锋利的边缘。谷歌搜索告诉我,它似乎不可能在opengl-es 2.0中使用曲面法线,但另一种技术是使用每个顶点的多个顶点法线来表现就像使用曲面法线一样。

这意味着正常数组和顶点数组的索引缓冲区需要不同,因为例如,一个立方体将有8个顶点,但每个顶点需要3个法线才能像表面法线一样(每个顶点一个)连接立方体的面,如果模型是三角形的,那么可能需要更多的操作。所以顶点的索引数组为8,法线的索引数组为8x3 = 24.

有谁知道怎么做呢?

目前我的代码看起来像这样

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*sizeof(GLubyte), indices, GL_STATIC_DRAW);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);        
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);

glGenBuffers(1, &_normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer);
glBufferData(GL_ARRAY_BUFFER, numNormals*sizeof(GLfloat), normals, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, 0);

1 个答案:

答案 0 :(得分:2)

每个顶点不能有多个法线,并且法线和位置不能有不同的索引。

执行此操作的唯一方法是复制您的位置数据,并为每个位置附加不同的法线。