从int转换gl_VertexID到float非常慢

时间:2018-07-26 14:49:03

标签: opengl glsl

我正在渲染一个八叉树,其中包含指向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

有没有解决方法(也是什么原因造成的?)

1 个答案:

答案 0 :(得分:0)

我发现了问题。在着色器中,如果使用的是b+i级联(我知道这不是一个好习惯,但它是一个测试着色器)。

似乎我超出了某些缓存大小。动态生成着色器代码,仅使用条件评估为真的部分才能解决此问题。条件的数量和对if/else的访问都降低了渲染速度。