Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
WebGL-在着色器的不同位置渲染单个对象的多个副本_Webgl_Shader - Fatal编程技术网

WebGL-在着色器的不同位置渲染单个对象的多个副本

WebGL-在着色器的不同位置渲染单个对象的多个副本,webgl,shader,Webgl,Shader,我试图在webGL中编写一对顶点/片段着色器,以便能够读取单个对象的位置和方向,并在这些位置渲染该对象的多个实例 据我所知,顶点着色器和片段着色器都设置了一个变量,即gl_Position和gl_FragColor,以定义任何给定输入的位置和像素颜色。那么,我将如何渲染多个实例呢?我是否应该简单地通过一个循环为我想要渲染的所有副本多次设置gl_Position和gl_FragColor的值 这是一个作业,所以我想解释一下我应该如何从理论上解决这个问题 谢谢您的时间。在对象的实例上循环。对于每个实

我试图在webGL中编写一对顶点/片段着色器,以便能够读取单个对象的位置和方向,并在这些位置渲染该对象的多个实例

据我所知,顶点着色器和片段着色器都设置了一个变量,即gl_Position和gl_FragColor,以定义任何给定输入的位置和像素颜色。那么,我将如何渲染多个实例呢?我是否应该简单地通过一个循环为我想要渲染的所有副本多次设置gl_Position和gl_FragColor的值

这是一个作业,所以我想解释一下我应该如何从理论上解决这个问题


谢谢您的时间。

在对象的实例上循环。对于每个实例,设置指定当前实例的位置偏移和颜色的制服,然后发出绘制调用以渲染相应实例。顶点着色器应使用传递的位置偏移来计算实例在世界坐标中的实际位置,使用模型视图投影矩阵对其进行变换,并将结果写入
gl\u position
。在片段着色器中,应使用传递的颜色派生在
gl\u FragColor
中写入的最终片段颜色

如果对象实例的数量非常大(以至于需要发出太多的绘制调用),则将实例的所有相关数据打包到一个(或多个)大型顶点缓冲区中,并为存储在此(ese)顶点缓冲区中的所有实例发出单个绘制调用


最后请注意,WebGL目前不支持核心API中的实例化,但有一个扩展提供了此功能:。

这些问题听起来像是在问,是否有办法在着色器程序中乘以原语,您只需要将三角形的三个顶点输入管道,硬件就会在不同的位置绘制其中的几个顶点


答案是:这需要一个几何体着色器。不幸的是,几何体着色器不是当前WebGL规范的一部分。因此,唯一的方法是在每次绘制之间更改着色器一致性的同时循环缓冲区对象。

简单的回答是,在每次绘制调用之前,通过将着色器的输出设置为不同的值,使用一致性修改着色器的输出。听起来读一些关于WebGL的教程会更好。非常感谢你,我花了一段时间才明白怎么做,但最后我终于明白了。如果所有相关数据都打包到一个较大的顶点缓冲区中,顶点着色器如何知道如何处理每个实例?它与步幅信息有关吗?步幅更多地与多个交错顶点属性有关。大顶点缓冲区应包含渲染实例所需的所有信息。这可能包括颜色、位置等。。。(必须为每个实例指定)。使用ANGLE_instanced_arrays扩展,可以独立设置每个顶点属性的使用率:因此可以避免为实例属性重复指定相同的值(例如,每N个实例使用相同的颜色)。