2012-07-09 26 views
0

目前IM,而是等同于具有模型在照明方面看起来圆润,这是不理想的,因为我的模型意味着有锋利的边缘。周围的Googling让我发现,它似乎并不可能在OpenGL-ES 2.0的使用表面法线,但另一种技术是使用每个顶点的多个顶点的法线,如果你是使用表面法线采取行动。是可以使用一个每个顶点正常的我的模型让每个顶点的多条法线在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); 
+0

好的建议一直没有顶点分享我的模型,它应该工作,虽然是有点扯淡办法做到这一点,如果你的模型是非常大的,但我有至多20个顶点,所以它不应该是太糟了。如果我得到它的工作,并没有人发布了答案生病写作答案 – Fonix 2012-07-09 15:51:06

回答

2

你不能每个顶点多条法线,你不能有法线和位置不同的指数。

这样做会复制你的位置数据,并附加不同的标准,以每个位置上的唯一途径。

+0

啊该死,谢谢。必须以某种方式得到我的顶点数据以不同的方式,然后 – Fonix 2012-07-09 18:00:39

+0

如果您正在使用着色器,那么你可以自由地诠释你每个顶点传递任何你想要的方式(属性)的数据。 – AbleArcher 2013-12-08 22:03:47

相关问题