Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 疯狂慢射线跟踪器_Opengl_Glsl_Fragment Shader_Raytracing - Fatal编程技术网

Opengl 疯狂慢射线跟踪器

Opengl 疯狂慢射线跟踪器,opengl,glsl,fragment-shader,raytracing,Opengl,Glsl,Fragment Shader,Raytracing,我最近开始研究一种光线跟踪器,尽管它工作得很好,但很快就遇到了一些麻烦。我试着模拟一个公园,我基本上有一个DistanceFromPointvec3 p函数,它计算一个点到最近物体的距离,在这个函数中,我调用其他函数,比如DistanceToBench,给我到单个物体的距离,我用它的最小值来计算最小距离。我所有的函数,比如DistanceToBench,都会先做一个AABB测试,如果通过了,他们会继续做一个更完整的检查。我遇到麻烦的部分是,如果我有一个对象,渲染一帧大约需要70毫秒。如果我有2个

我最近开始研究一种光线跟踪器,尽管它工作得很好,但很快就遇到了一些麻烦。我试着模拟一个公园,我基本上有一个DistanceFromPointvec3 p函数,它计算一个点到最近物体的距离,在这个函数中,我调用其他函数,比如DistanceToBench,给我到单个物体的距离,我用它的最小值来计算最小距离。我所有的函数,比如DistanceToBench,都会先做一个AABB测试,如果通过了,他们会继续做一个更完整的检查。我遇到麻烦的部分是,如果我有一个对象,渲染一帧大约需要70毫秒。如果我有2个,大约200个。如果我有3个,它会上升到500个或更多,4个或更多的对象会使整个场景崩溃,大约每帧15-20秒。如果我尝试使用阴影,同样的事情-如果我有一个对象,阴影会将渲染时间从70毫秒增加到180毫秒左右,但当我添加2或3个对象时,我无法再使用阴影渲染场景,而不会破坏整个场景。这是我实际代码的一部分

float u = (pos.x - 0.5) * 2 * 1.77;
float v = (pos.y - 0.5) * 2;

vec3 ro = eye;
vec3 rd = normalize(forward * f + right * u + up * v);

int materialID;
float dist;

vec3 color = skyColor;

if (CastRay(ro, rd, dist, materialID))
{
    vec3 N = NormalAtPoint(ro + rd*dist);
    vec3 L = -lightDir;
    vec3 V = -rd;
    vec3 H = normalize(V + L);

    float diffuseTerm = saturate(dot (N, L));
    float aoTerm = AOAtPoint(ro + rd*dist, N);
    #ifndef SHADOWS
    float shadowTerm = 1;
    #else
    float shadowTerm = mix(0.5, 1, ShadowAtPoint(ro + rd*dist, L, materialID));
    #endif
    color = mix(materialDarkColor[materialID], materialLightColor[materialID], diffuseTerm) * aoTerm * shadowTerm;
}

color = ApplyFog(rd, dist, color, -lightDir);
这里使用的主要功能是CastRay,它只是从ro沿rd移动,直到到达远平面,或者与我使用前面提到的DistanceFromPoint测试的对象碰撞

所以我的问题是,当对象数量稍微增加时,有没有办法阻止程序崩溃?我读过关于将世界划分为网格并将对象放置在网格中的内容,但由于我的对象并不完全位于网格中,而且因为我的世界将包含类似7-8个对象,所有这些对象都将进行AABB测试,所以我决定跳过使用它。除此之外,我不知道如何加速这件事。任何处理这种情况的建议都将不胜感激


此外,我还了解到着色器不能很好地处理分支,因为所有线程都必须在给定的时间点执行相同的指令。如果是这样的话,我最好使用CPU而不是GPU来进行渲染,因为我的代码中有这么多分支?

如果渲染一个对象需要70毫秒,那么您的跟踪器架构就有严重问题。你有没有分析过你的代码,看看这70毫秒是从哪里来的?它真的是GLSL吗?当我说“对象”时,我指的是一个复杂的对象,比如由几个基本体组成的复杂形状。像单个球体这样的单个基本体几乎不占用任何时间,我目前将FPS限制为60,因此不确定渲染所需时间是否少于16毫秒,但它至少与之一样快。如果它仍然很慢,那么我不知道为什么。不,我还没有试着分析我的代码-我对glsl很陌生,所以我不知道怎么做。有什么建议吗?是的,绝对是GLSL。如果您愿意,我可以向您展示整个代码。@user3541787几个原语是多少?如果有很多的话,你可能想考虑对象内的一些空间细分方案。实际上,几个不是太多。类似于7-8原语。我观察到的是,速度随着对象的数量呈指数下降——一个基本体几乎不需要任何时间,8-10个基本体需要70毫秒,任何超过50个粗略猜测,但应该相当准确的东西都会导致它需要10秒或更多的时间来渲染。似乎错误不在该片段中。也许你可以展示更多的片段,我们可以说错误是否不在这些片段中。或者你可以把你的代码放在Github上或者别的什么东西上。