Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 - Fatal编程技术网

在索引几何体和非索引几何体中,如何在WebGL中转换顶点?

在索引几何体和非索引几何体中,如何在WebGL中转换顶点?,webgl,Webgl,我试图消化这两个链接: 管道概述说明顶点着色器在基本体程序集之前运行 第二条提到: 顶点着色器(通常)与其输入保持不变。也就是说,在单个绘图命令中,获得完全相同输入属性的两个顶点着色器调用将返回二进制相同结果。因此,如果OpenGL能够检测到顶点着色器调用与上一次调用具有相同的输入,则允许重用上一次调用的结果,而不是浪费宝贵的时间执行它已经知道答案的操作 OpenGL实现通常不会通过实际比较输入值来实现这一点(这将花费太长的时间)。相反,这种优化通常仅在使用索引渲染函数时发生如果一个特定索引

我试图消化这两个链接:

管道概述说明顶点着色器在基本体程序集之前运行

第二条提到:

顶点着色器(通常)与其输入保持不变。也就是说,在单个绘图命令中,获得完全相同输入属性的两个顶点着色器调用将返回二进制相同结果。因此,如果OpenGL能够检测到顶点着色器调用与上一次调用具有相同的输入,则允许重用上一次调用的结果,而不是浪费宝贵的时间执行它已经知道答案的操作

OpenGL实现通常不会通过实际比较输入值来实现这一点(这将花费太长的时间)。相反,这种优化通常仅在使用索引渲染函数时发生如果一个特定索引被多次指定(在同一个实例渲染中),则该顶点将保证产生完全相同的输入数据。

因此,实现在顶点着色器的结果上使用缓存如果再次出现索引/实例对,并且结果仍在缓存中,则不会再次执行顶点着色器因此,顶点着色器调用可能少于指定的顶点

如果我有两个四边形,每个四边形有两个三角形:

索引:

verts: { 0 1 2 3 }
tris:  { 0 1 2 }
         { 1 2 3 }
汤:

可能还有一个顶点着色器,如下所示:

uniform mat4 mvm;
uniform mat4 pm;

attribute vec3 position;

void main (){
  vec4 res;
  for ( int i = 0; i < 256; i++ ){
     res = pm * mvm * vec4(position,1.);
  }
gl_Position = res;

还有一个镶嵌的四边形(100x100段),我可以说索引版本运行得更快,或者可以运行得更快,或者可能会说什么都不说吗?

就像GPU中的所有东西一样,根据规范,你可以什么都不说。这取决于驱动程序和GPU。但实际上,在您的示例中,4个顶点几乎在任何地方都比6个顶点运行得快

搜索顶点顺序优化,出现了很多文章


spec vs realtiy的另一个例子是,根据spec,深度测试在片段着色器运行之后进行(否则您无法在片段着色器中设置
gl\u FragDepth
。实际上,虽然只要结果相同,但驱动程序/GPU可以做任何它想做的事情,因此不设置
gl\u FragDepth
discard
的片段着色器将首先对某些片段进行深度测试,并且仅在测试通过时才运行该测试。

当模具l和深度测试是一个完全不同的困惑话题,对此我可能想问另一个问题:)在你的示例中,4个顶点几乎在任何地方都比6个顶点运行得快,但实际上你为什么要编写
作为一个问题?听起来好像它违背了“什么都不说”的原则?在这个例子中,我给出了100x100平面将给出
10201
顶点,一个三角形汤
60000
。常识告诉我,是的,数量越小渲染速度就越快,但通过阅读原始的两个链接,我意识到我不明白它是如何工作的。而且,在最长的一段时间里,我都听到了“三角形计数”被称为衡量轻/高性能游戏模型的指标,而顶点数似乎更为重要。这就是为什么我在考虑超重型顶点计算的例子,以及第二个例子中索引/汤的相同三个计数之间的更高数量的顶点。不知道栅格化的成本有多高一个三角形,我猜第一个例子在汤的情况下会延长50%。谢谢你的链接,答案是,我需要消化一下这个问题:)它的工作原理是有一个缓存。因此,如果计算顶点索引1,然后使用1000个其他顶点,然后再次使用顶点1,如果它在缓存中,则不会再次调用顶点着色器。如果它不在缓存中,将再次调用顶点着色器。每个GPU都有一个不同大小的顶点缓存。至于性能,填充率更为重要。因此,100个全屏1920x1080简单纯色平面的绘制速度要比100万个1像素三角形慢得多(都是在一次绘制调用中)。采样器也有缓存,所以在纹理上跳跃很慢。谢谢分享这些文章。这很有教育意义。
uniform mat4 mvm;
uniform mat4 pm;

attribute vec3 position;

void main (){
  vec4 res;
  for ( int i = 0; i < 256; i++ ){
     res = pm * mvm * vec4(position,1.);
  }
gl_Position = res;
void main(){
  gl_FragColor = vec4(1.);
}