【发布时间】:2016-10-31 16:06:44
【问题描述】:
我想写一个有符号的距离解释。例如,我正在创建一个体素网格 100*100*100 (如果它正在工作,尺寸会增加)。 现在我的计划是将点云加载到一维纹理中:
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 网格,所以每个体素并迭代该纹理的所有点,计算到我当前体素的距离并将该距离存储在新纹理 (1000x1000) 中。目前,我正在创建的这个纹理只包含颜色值,它将距离存储在红色和绿色分量中,蓝色设置为 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);
}
【问题讨论】:
-
您使用的是哪个操作系统?在 Windows 上,WDDM 可能会强制您的应用退出(尽管它看起来更像是驱动程序恢复而不是着色器退出)
-
OS X El Capitan 版本 10.11.5
-
那就不可能了。你确定你的音量没有被剔除吗?
-
我不这么认为,如果我只使用点云中的少量点(例如 1000)它可以正常工作,但如果我使用 10000 则会出现问题。
-
这永远不会实时工作,除非您采取措施减少每个片段的工作量。现在我向你保证正在发生的事情是你的片段花费了太长时间,它触发了一个看门狗计时器,并且驱动程序重置了 OpenGL 上下文。有一些鲁棒性扩展可以避免杀死冗长的着色器执行,但这只是一个创可贴。考虑使用几何着色器或其他东西将这项工作拆分为多个简单的调用,并在最后合并结果。我真的不明白你在这里想要做什么更具体。