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中使用STD140?_Opengl_Glsl_Opengl 3_Opengl 4 - Fatal编程技术网

我应该什么时候在OpenGL中使用STD140?

我应该什么时候在OpenGL中使用STD140?,opengl,glsl,opengl-3,opengl-4,Opengl,Glsl,Opengl 3,Opengl 4,我什么时候在OpenGL中使用STD140作为统一块 虽然我不是百分之百确定,但我相信有一种替代方法可以实现同样的目标,称为“共享” 这只是编码员的偏好吗?还是有理由使用一个而不是另一个?中介绍了统一缓冲区对象 可以将统一块的数据存储声明为使用内存中三种布局之一:打包、共享、或std140 压缩的统一块具有依赖于实现的数据布局以提高效率,编译器可以消除未使用的统一块以节省空间 shareduniform块(默认布局)具有依赖于实现的数据布局以提高效率,但布局将由块的结构唯一确定,允许跨程序共享数

我什么时候在OpenGL中使用STD140作为统一块

虽然我不是百分之百确定,但我相信有一种替代方法可以实现同样的目标,称为“共享”


这只是编码员的偏好吗?还是有理由使用一个而不是另一个?

中介绍了统一缓冲区对象

可以将统一块的数据存储声明为使用内存中三种布局之一:
打包
共享
、或
std140

  • 压缩的
    统一块具有依赖于实现的数据布局以提高效率,编译器可以消除未使用的统一块以节省空间

  • shared
    uniform块(默认布局)具有依赖于实现的数据布局以提高效率,但布局将由块的结构唯一确定,允许跨程序共享数据存储

  • std140
    统一区块具有标准的跨平台跨供应商布局。未使用的制服将不会被淘汰


  • std140
    统一块布局,保证了特定的打包行为,不需要应用程序查询偏移量和跨距。在这种情况下,即使仅基于统一块声明预先确定最小大小,也可以查询最小大小。通过应用OpenGL规范中描述的一组规则,可以从统一块的定义中导出统一块中每个统一块的偏移量

    std140在一次更新所有的统一块时最有用,例如用于渲染场景的矩阵和照明值的集合。在着色器中使用std140声明块,可以使用结构在C中复制内存布局。不必从C查询和保存块内每个值的偏移量,只需一次调用glBufferData(GL\u UNIFORM\u BUFFER、sizeof(my\u struct)和my\u struct即可


    你确实需要对C语言中的对齐有点谨慎,例如,vec3将占用4个浮点数,而不是3个浮点数,但它仍然比IMHO容易得多。

    如果你知道,那么你应该已经知道为什么你会或不想使用它。那么,你是在问什么是
    std140
    布局?@Nicolas Nope,我知道区别在于你必须使用它查询和一个你必须填写的问题。我的问题仍然有效。@Nicolas:我在我正在学习的代码中看到了它,并且很高兴找到这个资源来帮助理解它。std430也是一个替代品。@AzP根据OpenGL wiki,std430不能与统一块一起使用。()