eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming[asm/c] optymalizacja elementarnego raytracera[asm/c] optymalizacja elementarnego raytracera
  • Data: 2012-08-01 19:07:25
    Temat: [asm/c] optymalizacja elementarnego raytracera
    Od: " prof fir" <f...@g...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    jakis rok czy pol roku temu trzasnalem kawalek kodu elementarnego
    raytracera

    https://dl.dropbox.com/u/42887985/re29.zip

    bylo to pisane ledwie dwa dni (chyba nawet niecale) i bylem zadowolony ze
    dobrze poszlo, ale kod jest rozbabrany i nie optymalizowany, ew teraz bym
    chcial pokombinowac czy da sie to przyoptymalizowac - najchetniej przepisac
    kluczowe kawalki na asma (sse2 bo mam tymczasowo wiekowa maszyne z p4),

    moze nie bede wklejac calek procedury bo jest rozbabrana ale opisze
    kluczowe kawalki, i ew ktos moglby najlepiej udzielic mi jakichs
    cennych uwag (najlepiej jak by to moglo wygladac konkretnie w asmie)
    - mozna by wtedy porozmawiac o optymalizacji a sa to ciekawe topiki

    jak to leci - mam cztery kulki i jedna plaszczyzne,
    dl akazdego punktu okna wyznaczam odleglosc do kazdej z kulek i
    plaszczyzny


    float distSphere01 = intersectRaySphere(&ray0,&rayV,&sphere01,15);
    float distSphere02 = intersectRaySphere(&ray0,&rayV,&sphere02,15);
    float distSphere03 = intersectRaySphere(&ray0,&rayV,&sphere03,15);

    float distSphere1 = intersectRaySphere(&ray0,&rayV,&sphere1,100);
    float distSphere2 = -1;// intersectRaySphere
    (&ray0,&rayV,&sphere2,1500);

    float distPlane = intersectionRayPlane(&ray0, &rayV, &vPlane,
    &planeNormal);




    inline float intersectionRayPlane(float3* rayOrigin,
    float3* rayDirection,
    float3* planeOrigin,
    float3* planeNormal)
    {
    static float3 D;

    D = sub(planeOrigin, rayOrigin);

    float a = dot(&D, planeNormal);
    float b = dot(rayDirection, planeNormal);

    if(b!=0)
    {
    return a/b;
    }
    else
    {
    return -1;
    }

    }

    inline float intersectRaySphere(float3* rO, float3* rV, float3* sO, float sR)
    {
    static float3 Q;

    Q = sub(sO,rO);
    float c = length(&Q);
    float v = dot(&Q,rV);
    float d = sR*sR - (c*c - v*v);

    // If there was no intersection, return -1
    if (d < 0.0) return (-1.0f);

    // Return the distance to the [first] intersecting point
    return (v - sqrt(d));
    }

    pozniej znajduje najblizsza z tych odleglosci licze normalna i
    w zaleznosci od iloczynu sklarnego zapalam punkt - ta druga czesc mozna
    by na razie pominac - pytanie jak przyoptymalizowac to co powyzej -
    ktos ma jakies konkretne rozwiazania, ?? moge przetestowac i zobacze
    czy bedzie speed up - sam tez moze pokombinuje ale sensowne merytoryczne
    uwagi mile widziane









    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: