我正在渲染一个八叉树,其中包含指向FBO的点。
我想要一种方法来识别要渲染的点。
为此,我为每个八叉树节点设置了一个ID(16位整数)。而且我使用gl_VertexID来标识节点中的一个点(每个节点不超过65k点)
我将其输出到RGBA纹理,并将八叉树节点标识符写入rg
颜色分量,并将顶点ID写入ba
颜色分量。
vec4 getIdColor() {
float r = mod(nodeID, 256.0) / 255.0;
float g = (nodeID / 256.0) / 255.0;
float b = mod(gl_VertexID, 256.0) / 255.0;
float a = (gl_VertexID/ 256.0) / 255.0;
return vec4(r, g, b, a);
}
问题是从int转换为float的gl_VertexID确实很慢(渲染200万点时,我从60FPS降低到2-3 FPS)。
编辑:仅使用gl_VertexID
时,我也有完全相同的问题。如果我删除mod并公正地写
return vec4(gl_VertexID);
我对帧率有相同的评价。所以问题出在gl_VertexID,而不是mod
有没有解决方法(也是什么原因造成的?)
答案 0 :(得分:0)
我发现了问题。在着色器中,如果使用的是b+i
级联(我知道这不是一个好习惯,但它是一个测试着色器)。
似乎我超出了某些缓存大小。动态生成着色器代码,仅使用条件评估为真的部分才能解决此问题。条件的数量和对if/else
的访问都降低了渲染速度。