Трассировка лучей с помощью треугольных ячеек в WebGL не работает с треугольниками 3k + - PullRequest
0 голосов
/ 07 марта 2019

Я тестировал трассировщик лучей, который написал для обратной связи по fps. С сетками, состоящими из 3k + треугольников, он корректно рендерится примерно на 2 секунды, после чего весь холст становится красным (красный - основной цвет в сцене). Я пишу здесь, чтобы получить обратную связь о том, что происходит, если у меня есть какая-то фундаментальная ошибка, которую я не могу понять, или это потому, что у меня нет никакого метода ускорения (BVH или kd-дерева) для моего пути трассировки лучей, и Теперь я проверяю пересечения во всех треугольниках. Небольшие сцены (1-1,5 тыс. Треугольников), я могу отрисовать их с успехом, поэтому я не могу представить, что происходит не так. Я думал, что это будет идти медленнее.

Я публикую ниже 2 основные функции моего трассировщика лучей в openGL ES

bool hitScene(Ray R_, out vec3 hitPos, out vec3 normal, out Material material, Sphere lightSource){ 

    vec4 a = vec4(0.0), b = vec4(0.0), c = vec4(0.0), aN = vec4(0.0),bN= vec4(0.0),cN= vec4(0.0);
    float mindist = 1000.;
    bool weHitSomething = false;
    vec3 hitPos1 = vec3(0.),triangleNormal = vec3(0.,0.,0.), sphereNormal, barycentricCoord;


    int alg = 2;
    if (alg == 2) {

        //here we chck all the mesh if we hit a triangle if the mesh and we keep the closest hitpoint

        for (int i = 0; i < vertsCount; i += 3) {

            a = texelFetch(uMeshData, ivec2(i, 0), 0);
            b = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(1, 0));
            c = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(2, 0));

            aN = texelFetch(uNormData, ivec2(i, 0), 0);
            bN = texelFetchOffset(uNormData, ivec2(i, 0), 0, ivec2(1, 0));
            cN = texelFetchOffset(uNormData, ivec2(i, 0), 0, ivec2(2, 0));

            vec3 uvt;
            vec3 intersect;
            float z;
            bool isHit = hitTriangleSecond(R_.orig, R_.dir, a.xyz, b.xyz, c.xyz, uvt, triangleNormal, intersect, z);
            if (isHit) {

                if (z<mindist && z > 0.001) {
                    hitPos1 = intersect;

                    mindist = z;
                    weHitSomething = true;
                    material.type = DIEL;
                    material.albedo = vec3(.8, .3, .4);
                    normal = normalize(aN.xyz*uvt.x + bN.xyz*uvt.y + cN.xyz*uvt.z);
                    hitPos = hitPos1;            
                }
            }      
        } 

    }

   return weHitSomething;
}

//Trace is the main function of the max bounces
vec3 Trace(out Ray ray, Sphere lightSource){

    vec3 hitPos, normal;
    bool isShpere;
    Material material;
    vec3 color = vec3(1.);
    vec3 attenuation = vec3(1.);
    vec3 light = vec3(1.,1.,1.), shadow = vec3(1.,1.,1.);

        for(int i=0; i< 3; i++){

            // we check if we hit something
            if(hitScene(ray, hitPos, normal, material, lightSource)){
                if (material.type == METAL) {
                    //we calculate the new direction
                    vec3 direction = normalize(reflect(ray.dir, normal));


                    ray = Ray(hitPos, direction); 
                    light = getLight(color, lightSource,hitPos, normal);
                    //shadow = calcShadow(lightSource, hitPos);
                    color *= material.albedo * light*shadow;
                     attenuation *= material.albedo;   
                     //color = normal *light; 
                }
                if (material.type == DIEL) {
                    //we calculate the new direction
                    vec3 direction = normalize(reflect(ray.dir, normal));

                    ray = Ray(hitPos, direction); 
                    light = getLight(color, lightSource,hitPos, normal);
                    //shadow = calcShadow(lightSource, hitPos);
                    color *= material.albedo * light*shadow;
                    attenuation *= material.albedo;   

                }
            } else {
                //color = attenuation * vec3(.2,.2, .2);
            }

        }

    return color;
}

Я написал анализатор объектов, чтобы треугольник оставался нормальным для каждой вершины и вершин треугольника в Python. а затем они загружаются в функцию hitScene ()

...