Я тестировал трассировщик лучей, который написал для обратной связи по 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 ()