在OpenGL中每个三角形只能存储1种颜色吗?[duplicate]

nwlqm0z1  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(152)

此问题在此处已有答案

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带宽.
如何为每个三角形只存储一种颜色?

6uxekuva

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

相关问题