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,GL_RGBA,pc->pc.size(),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,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所述,
最典型的值列于here和here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |