c – GLSL停止渲染

我想写一个签名的距离解释.为此,我正在创建一个体素网100 * 100 * 100(如果它工作,大小会增加).

现在我的计划是将点云加载到1d纹理中:

glEnable(GL_TEXTURE_1D);
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_1D, _texture);

glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, pc->pc.size(), 0, GL_RGBA, GL_FLOAT, &pc->pc.front());

glBindTexture(GL_TEXTURE_1D, 0);

‘pc’只是一个包含结构Point的向量的类,它只有浮点数x,y,z,w.

比我想要渲染洞100x100x100网格,所以每个体素和迭代通过该纹理的所有点,计算到我当前体素的距离并将该距离存储在新纹理(1000×1000)中.目前我正在创建的这个纹理只保留颜色贵重物品,它存储红色和绿色组件中的距离,蓝色设置为1.0.
所以我可以在屏幕上看到结果.

我现在的问题是,当我的点云中有大约500 000个点时,似乎在几个体素(小于50 000)之后停止渲染.我的猜测是,如果它需要很长时间,它会停止并只是将它所拥有的缓冲区拉出来.
我不知道是否会出现这种情况,但是如果是这样的话,我可以采取哪些措施来对付它,或者我可以做些什么来使这个程序更好/更快.

我的第二个猜测是,我不会考虑使用1D纹理.但是有更好的方法来传递大量数据吗?因为我肯定需要几十万点数据.

我不知道如果我显示完整的片段着色器是否有帮助,所以我只会显示一些部分,我认为这对于该问题很重要:

距离计算和所有点的迭代:

for(int i = 0; i < points; ++i){
        vec4 texInfo = texture(textureImg, getTextCoord(i));
        vec4 pos = position;
        pos.z /= rows*rows;
        vec4 distVector = texInfo-pos;
        float dist = sqrt(distVector.x*distVector.x + distVector.y*distVector.y + distVector.z*distVector.z);
        if(dist < minDist){
            minDist = dist;
        }
    }

函数getTexCoord:

float getTextCoord(float a)
{
    return (a * 2.0f + 1.0f) / (2.0f * points);
}

*编辑:

vec4 newPos = vec4(makeCoord(position.x+Col())-1,
                   makeCoord(position.y+Row())-1,
                   0,
                   1.0);

float makeCoord(float a){
return (a/rows)*2;
}

int Col(){
float a = mod(position.z,rows);
return int(a);
}

int Row()
{
    float a = position.z/rows;
    return int(a);
}

最佳答案 >你绝对不应该在片段着色器中循环遍历所有点,因为它每帧计算N次(其中N等于像素数),这有效地提供了O(N2)计算复杂度.

>所有纹理都限制了每个维度可容纳的数据量.这里有两个最重要的值是GL_MAX_TEXTURE_SIZE和GL_MAX_3D_TEXTURE_SIZE.如
official docs所述,

Texture sizes have a limit based on the GL implementation. For 1D and 2D textures (and any texture types that use similar dimensionality, like cubemaps) the max size of either dimension is GL_MAX_TEXTURE_SIZE. For array textures, the maximum array length is GL_MAX_ARRAY_TEXTURE_LAYERS. For 3D textures, no dimension can be greater than GL_MAX_3D_TEXTURE_SIZE in size.

Within these limits, the size of a texture can be any value. It is advised however, that you stick to powers-of-two for texture sizes, unless you have a significant need to use arbitrary sizes.

最典型的值列于herehere.
>如果您真的必须在frag着色器中使用大量数据,请考虑具有已知2维度和GL_NEAREST / GL_REPEAT坐标的2D或3D纹理.这将使您能够计算2D纹理坐标,只需将源偏移乘以预先计算的1 /宽度值(Y坐标;其余的定义小于1个纹素,并且可以在GL_NEAREST存在时安全地忽略)并将其用作-is for X coord(GL_REPEAT保证只使用其余部分).我个人在需要将128 MB数据传递给GLSL 1.20着色器时实现了这种方法.
>如果您的目标是最近的OpenGL(≥3.0),您也可以使用buffer textures.
>最后,但并非最不重要.您不能通过标准IEEE浮点数传递大于224的整数精度值.

点赞