Hesaplama gölgelendiricisi aracılığıyla OpenGL'de bazı raytracing yapmaya çalışıyorum ve garip bir problemle karşılaştım. Şu anda herhangi bir gölgeleme olmadan bir küre göstermek istiyorum. Benim shader miktarı her piksel için bir ray başlattı ve şöyle görünür:OpenGL'de hesaplama gölgelendiricisi aracılığıyla Raytracing
#version 430
struct Sphere{
vec4 position;
float radius;
};
struct Ray{
vec3 origin;
vec3 dir;
};
uniform image2D outputTexture;
uniform uint width;
uniform uint height;
float hitSphere(Ray r, Sphere s){
float s_vv = dot(r.dir, r.dir);
float s_ov = dot(r.origin, r.dir);
float s_mv = dot(s.position.xyz, r.dir);
float s_mm = dot(s.position.xyz, s.position.xyz);
float s_mo = dot(s.position.xyz, r.origin);
float s_oo = dot(r.origin, r.origin);
float d = s_ov*s_ov-2*s_ov*s_mv+s_mv*s_mv-s_vv*(s_mm-2*s_mo*s_oo-s.radius*s.radius);
if(d < 0){
return -1.0f;
} else if(d == 0){
return (s_mv-s_ov)/s_vv;
} else {
float t1 = 0, t2 = 0;
t1 = s_mv-s_ov;
t2 = (t1-sqrt(d))/s_vv;
t1 = (t1+sqrt(d))/s_vv;
return t1>t2? t2 : t1 ;
}
}
layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
void main(){
uint x = gl_GlobalInvocationID.x;
uint y = gl_GlobalInvocationID.y;
if(x < 1024 && y < 768){
float t = 0.0f;
Ray r = {vec3(0,0,0), vec3(width/2-x, height/2-y, 1000)};
Sphere sp ={vec4(0, 0, 35, 1), 5.0f};
t = hitSphere(r, sp);
if(t <= -0.001f){
imageStore(outputTexture, ivec2(x, y), vec4(0.0, 0.0, 0.0, 1.0));
} else {
imageStore(outputTexture, ivec2(x, y), vec4(0.0, 1.0, 0.0, 1.0));
}
if(x == 550 && y == 390){
imageStore(outputTexture, ivec2(x, y), vec4(1.0, 0.0, 0.0, 1.0));
}
}
}
Ben şu görüntü elde uygulamayı çalıştırdığınızda:
Ama olsun CPU aynı algoritmayı çalıştırdığınızda Aşağıdaki daha ikna edici görüntü:
İlk olarak, her pikselin kendi hesaplama gölgelendiricisi çağrısını almaması için yeterli çalışma grupları göndermediğimi düşündüm ama durum böyle değil. GPU tarafından oluşturulan görüntüde gördüğünüz gibi, hesaplama gölgesindeki son satırların neden olduğu ortada kırmızı bir piksel var. Bu, diğer tüm pikseller için yeniden üretilebilir.
şu anda 1024x768 çözünürlük kullanmak ve bu benim hesaplama shader sevk nasıl:#define WORK_GROUP_SIZE 16
void OpenGLRaytracer::renderScene(int width, int height){
glUseProgram(_progID);
glDispatchCompute(width/WORK_GROUP_SIZE, height/WORK_GROUP_SIZE,1);
glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
}
hatadır? Kayan nokta hesaplarının doğruluğu ile ilgili bir sorun olabilir mi?
Garip bu uygulama böyle garip bir davranış karşısında –
geldin .. aynen ben cumartesi günü yapılan bir şey gibi görünür:
Bu sorunu çözer? – Stan
# sürümünüzün yönergesi nerede? – genpfault