目前我为我的模型使用每个顶点一个法线,但这等同于让模型在照明方面看起来是圆形的,这并不理想,因为我的模型应该有锐利的边缘。谷歌搜索告诉我,在 opengl-es 2.0 中使用表面法线似乎是不可能的,但另一种技术是每个顶点使用多个顶点法线,就好像你在使用表面法线一样。
这意味着法线数组和顶点数组的索引缓冲区需要不同,因为例如,一个立方体将有 8 个顶点,但每个顶点需要 3 个法线来充当表面法线(每个连接面一个立方体,如果模型是三角化的opengl-es需要的,可能需要更多)。所以顶点的索引数组是 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);