Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenGL中绘制曲面法线?_Opengl_Graphics - Fatal编程技术网

如何在OpenGL中绘制曲面法线?

如何在OpenGL中绘制曲面法线?,opengl,graphics,Opengl,Graphics,我有一个顶点格式,它都是浮动的,如下所示: POSITION POSITION POSITION NORMAL NORMAL NORMAL TEXCOORD TEXCOORD 我在想我需要从前三个浮点数到下三个浮点数画一条线,然后我需要跳过下两个浮点数继续。有没有办法在不为正确布局中的每个对象创建另一个缓冲区的情况下执行此操作 我知道每次抽签我只能画一行,然后循环,但那是很多抽签吗?如何为调试之类的东西绘制法线 我也考虑过索引,但索引只帮助选择特定的顶点,在这种情况下,我想在普通顶

我有一个顶点格式,它都是浮动的,如下所示:

POSITION  POSITION  POSITION  NORMAL  NORMAL  NORMAL  TEXCOORD TEXCOORD
我在想我需要从前三个浮点数到下三个浮点数画一条线,然后我需要跳过下两个浮点数继续。有没有办法在不为正确布局中的每个对象创建另一个缓冲区的情况下执行此操作

我知道每次抽签我只能画一行,然后循环,但那是很多抽签吗?如何为调试之类的东西绘制法线


我也考虑过索引,但索引只帮助选择特定的顶点,在这种情况下,我想在普通顶点布局的两个属性之间绘制。这不能通过设置适当的
glvertexattributepointer来完成,因为您必须跳过texcoords。此外,您不希望从
位置
法线
,而是从
位置
位置+法线
,因为法线只描述方向,而不是空间中的点


您可以使用几何体着色器。基本上,您可以设置两个属性,一个用于位置,一个用于法线(与渲染模型时一样),并使用
GL_POINTS
基本类型发出绘制命令。然后,在几何体着色器中,生成一条从
位置
位置+法线
的直线。通常,要绘制曲面法线,需要设置单独的缓冲区或几何体着色器来完成此工作。为网格设置单独的缓冲区以仅绘制法线非常简单,并且不需要对每个法线进行绘制调用,所有曲面法线都将在单个绘制调用中绘制

因为您这样做是为了调试,所以不必太担心性能,只需坚持使用更快的方法即可将内容显示在屏幕上

我个人这样做的方式取决于网格是否具有顶点法线或面法线,例如,我们可以为网格中的每个顶点填充一条线,这些顶点与顶点本身的偏移表示需要使用以下伪代码调试的法线

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);