通常要绘制表面法线,您需要设置一个单独的缓冲区或几何着色器来完成这项工作。为网格设置单独的缓冲区以仅绘制法线是微不足道的,并且不需要为每个法线调用绘制调用,所有表面法线都将在单个绘制调用中绘制
由于您将这样做是为了调试,因此无需过多担心性能,只需坚持使用更快的方法即可将内容显示在屏幕上
我个人的做法取决于网格是否具有顶点法线或面法线,例如,我们可以为网格中的每个顶点填充一条线,其与顶点本身的偏移量代表您需要的法线使用以下伪代码进行调试
var normal_buffer = [];
//tweak to your liking
var normal_length = 10.0;
//this assumes your mesh has 2 arrays of the same length
//containing structs of vertices and normals
for(var i = 0; i < mesh.vertices.length; i++) {
//retrieving the normal associated with this vertex
var nx = mesh.normals[i].x;
var ny = mesh.normals[i].y;
var nz = mesh.normals[i].z;
//retrieving the vertex itself, it'll be the first point of our line
var v1x = mesh.vertices[i].x;
var v1y = mesh.vertices[i].y;
var v1z = mesh.vertices[i].z;
//second point of our line representing the normal direction
var v2x = v1x + nx * normal_length;
var v2y = v1y + ny * normal_length;
var v2z = v1z + nz * normal_length;
buffer.push(v1x, v1y, v1z, v2x, v2y, v2z);
}
您可以稍后照常进行并将缓冲区附加到顶点缓冲区对象并使用您喜欢的任何程序发出一个绘制调用来绘制所有网格法线
vertbuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertbuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(buffer), gl.STATIC_DRAW);
/* later on in your program */
gl.drawArrays(gl.LINES, 0, buffer.length / 3);
法线调试的一个很酷的功能是您可以在片段着色器中使用法线本身作为输出颜色来快速检查它是否指向预期的方向