此问题在此处已有答案:
Rendering meshes with multiple indices(2个答案)
6天前关闭。
当我需要设置一些三角形的颜色时,我需要如下定义每个顶点:
{
float x;
float y;
float z;
float r;
float g;
float b;
float alpha;
}
但在这种情况下,每个顶点都将具有一种颜色。
一个三角形有3个顶点,所以它需要3种颜色,而且大多数时候,单个三角形的每个像素都有相同的颜色。
但我需要为他们存储3色,这是浪费内存,VRAM和GPU带宽.
如何为每个三角形只存储一种颜色?
1条答案
按热度按时间6uxekuva1#
是的,这可以通过将颜色与位置分开存储来实现。有多种方法可以将顶点Map到颜色:
1.使用SSBO。对于顶点,仅存储x、y、z坐标。将所有颜色存储在Shader Storage Buffer Object中,并使用gl_VertexID作为SSBO中的索引:
color = ssbo_colors[gl_VertexID / 3];
.缺点是颜色不能重复使用,例如,如果您希望两个三角形都是红色,则红色必须存储两次。
1.使用SSBO,每个顶点都有一个索引。使用与1中相同的方法,但还要为每个顶点存储一个颜色索引。然后,可以 * 重用颜色:
color = ssbo_colors[color_idx];
个1.使用纹理。也可以将颜色存储在1D纹理中,存储每个顶点的纹理索引,并使用
texelFetch
来检索相应的颜色。也许这并不完全可取,因为纹理有限制(例如大小、纹理数量有限),并且您不会使用典型的纹理查找功能,如插值和镜像。方法1和2需要OpenGL 4.3。方法3需要OpenGL 3.3。
由于您没有在三角形的面上使用插值,因此可能需要确定顶点着色器中的颜色,并使用
flat
插值限定符将其传递给片段着色器,然后使用引发顶点。如果要进一步减少使用的内存量,请考虑将颜色存储为normalized integers。