0

目前我为我的模型使用每个顶点一个法线,但这等同于让模型在照明方面看起来是圆形的,这并不理想,因为我的模型应该有锐利的边缘。谷歌搜索告诉我,在 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);
4

1 回答 1

2

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

这样做的唯一方法是复制您的位置数据,并为每个位置附加不同的法线。

于 2012-07-09T17:25:21.123 回答