gpt4 book ai didi

c++ - GLSL 停止渲染

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:11 27 4
gpt4 key购买 nike

我想写一个带符号的距离解释。为此,我正在创建一个 voxelgrid 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' 只是一个包含结构点 vector 的类,它只有 float 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);
}

最佳答案

  1. 绝对不应该在片段着色器中遍历所有点,因为它每帧计算 N 次(其中 N 等于像素数),这实际上给你 O(N2) 计算复杂度。
  2. 所有纹理对每个维度可以容纳的数据量都有限制。这里两个最重要的值是 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 .

  3. 如果您确实必须在片段着色器中使用大量数据,请考虑使用已知二次方维度和 GL_NEAREST/GL_REPEAT 坐标的 2D 或 3D 纹理。这将使您能够通过将源偏移量乘以预先计算的 1/宽度值(Y 坐标;根据定义,余数小于 1 纹素,并且在存在 GL_NEAREST 的情况下可以安全地忽略)并将其用作- 用于 X 坐标(GL_REPEAT 保证只使用余数)。当我需要将 128 MB 数据传递给 GLSL 1.20 着色器时,我个人实现了这种方法。

  4. 如果您的目标是足够新的 OpenGL(≥ 3.0),您也可以使用 buffer textures .

  5. 最后一点,但并非最不重要。您不能通过标准 IEEE float 传递大于 224 的整数精度值。

关于c++ - GLSL 停止渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40316779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com