从活动顶点阵列生成平滑法线

时间:2014-03-20 01:07:59

标签: opengl hook vertex normals vertex-array

我试图通过挂钩OpenGl调用来破解和修改旧的opengl固定管道游戏的几个渲染功能,而我目前的任务是实现着色器照明。我已经创建了一个合适的着色器程序,可以正确地点亮我的大多数物体,但是这个游戏的地形是在没有提供正常数据的情况下绘制的。

游戏调用:

void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);

void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);`

定义和绘制地形,因此我将这些函数都挂钩,我希望循环遍历指针的给定顶点数组,并在每个DrawElements调用或VertexPointer调用中计算每个曲面的法线,但是我和#39;我无法想出这样做的方法 - 特别是如何读取,迭代和理解指针上的数据。在这种情况下,glVertexPointer来电的常用​​参数为size = 3, type = GL_float, stride = 16, pointer = some pointer。挂钩glVertexPointer,我不知道如何迭代指针并抓住网格的所有顶点,考虑到我不知道所有顶点的总数,也不知道数据是如何的在给出步幅的指针处构造 - 同样如何构造正常数组

尝试计算indice数组中每个指定索引的drawelements中的法线是否更好?

2 个答案:

答案 0 :(得分:2)

根据您的顶点数组构建过程,索引将是构建法线的唯一相关信息。

如果在顶点数组中添加法线字段,并且对解析索引数组的所有常规计算求和,则一个顶点的正常平均值的变化很简单。

你必须将每个正常总和除以索引中的重复次数,计算你可以在顶点索引之后保存在临时数组中的数量(每次将法线添加到顶点时递增)

所以更清楚:

Vertex[vertexCount]: {Pos,Normal}
normalCount[vertexCount]: int count

Indices[indecesCount]: int vertexIndex

每个顶点可能有6个法线,因此添加一个普通数组的临时数组,以便为​​每个顶点添加法线数组:

NormalTemp[vertexCount][6] {x,y,z}

解析你的indice数组(如果是三角形):

for i=0 to indicesCount step 3
   for each triangle top (t from 0 to 2)
       NormalTemp[indices[i + t]][normalCount[indices[i+t]]+1] = normal calculation with cross product of vectors ending with other summits or this triangle
       normalCount[indices[i+t]]++

比你必须将你的总和除以计数

for i=0 to vertexCount step 1
    for j=0 to NormalCount[i] step 1
        sum += NormalTemp[i][j]
    normal[i] = sum / normacount[i]

答案 1 :(得分:0)

虽然我喜欢并且已经投了j-p的答案,但我仍然想指出你可以通过计算每个脸的一个法线并且只使用所有3个顶点来逃脱。它会更快,更容易,有时甚至更准确。