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_Attributes_Glsl_Shader - Fatal编程技术网

避免OpenGL缓冲区中的重复数据

避免OpenGL缓冲区中的重复数据,opengl,attributes,glsl,shader,Opengl,Attributes,Glsl,Shader,我正在尝试在OpenGL中绘制一张由瓷砖制成的地图(至少是3.3版)。我目前的做法是将地图上每个平铺的所有顶点数据编译成单个数组,并将这些数据绑定到顶点数组中的缓冲区。法线和纹理坐标也是如此;每个都有自己的缓冲区。然后会有一个指向该数据的顶点属性指针,以便顶点着色器获得该数据 也就是说,当每个瓷砖都有自己的颜色时,这是一种单一的纯色(不是纹理或渐变),我实际上是将一个与顶点数组大小相同的数组传递到着色器中,即使瓷砖的所有6个顶点的颜色都是恒定的!这看起来非常浪费,因为它本质上是相同的数据x6。渲

我正在尝试在OpenGL中绘制一张由瓷砖制成的地图(至少是3.3版)。我目前的做法是将地图上每个平铺的所有顶点数据编译成单个数组,并将这些数据绑定到顶点数组中的缓冲区。法线和纹理坐标也是如此;每个都有自己的缓冲区。然后会有一个指向该数据的顶点属性指针,以便顶点着色器获得该数据

也就是说,当每个瓷砖都有自己的颜色时,这是一种单一的纯色(不是纹理或渐变),我实际上是将一个与顶点数组大小相同的数组传递到着色器中,即使瓷砖的所有6个顶点的颜色都是恒定的!这看起来非常浪费,因为它本质上是相同的数据x6。渲染贴图时,是否有一种方法可以有效地每隔6个顶点重用相同的数据

我会为每个图块使用统一的或属性,但请记住,所有图块都放置在一个顶点数组中,因此我无法分别为每个图块重新绑定它们


当前的方法确实有效,而且速度相当快(GT 750m上256x256瓷砖的速度为2000 fps),但我忍不住为简单地在整个阵列中复制数据而感到内疚,因此它匹配每个顶点,即使每个基本体的数据都是恒定的(事实上是两个基本体:构成方形瓷砖的两个三角形)。他们肯定是更好的方法吗?

你有各种方法来克服你的问题

  • 选项板:使用顶点属性(仅一个ubyte)从颜色数组中为每个平铺选择一个值(颜色为3/4 ubytes,因此只保存了2/3 ubytes)。当然,我假设您的颜色不超过256种(如果256种颜色不够,您可能会使用短颜色,最多65536种颜色)

  • 几何体/细分着色器:如果平铺只是正方形或其他简单形状,则必须将单个顶点作为输入,并提供一些基本信息(如平铺的大小),然后发射完整的基本体(这只允许您将数据大小减少5倍或更多倍,但您必须学习许多额外的GL功能,这也不错)