我试图通过挂钩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中的法线是否更好?
答案 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个顶点来逃脱。它会更快,更容易,有时甚至更准确。