Hallo Jungs. Ich implementiere jetzt das licht in meinen engine. Ich mache gerade die punkt lichter. Ich habe schon die screen coverage optimalizierung implementier, welche basiert auf dem Gamasutra "The Mechanics of Robust Stencil Shadows" article in der sektion "Scissor Optimization" http://www.gamasutra.com/view/feature/2 ... hp?print=1. Dann die licht zmin-zmax optimalizierung, welche verhindert das nur die tiles kalkuliert werden, die in der grenze von zmin-zmax des lichtes liegen. Ich habe auch uber die optimalizierung nachgedacht, welche verhindert, dass das tile nicht per-pixel kalkuliert werdens soll, wenn kein punkt in diesen tile mit seinem normal zum licht zeigt. Fur die pararell lichter habe ich die loesing gefunden (hofe ich) . Ich kalkuliere das aritmetische durchschnitts normal von allen normals die in diesen tile sind. Normaliziere diesen normal und dann kalkuliere ich den niedrigsten cosinus wert zwischen den durchschnits normal vektor und die anderen normal vektoren mit dem dotproduct:
Ein pseudo-code fur bessere verstehung:
Code:
type fvec3=record x,y,z:single
var normals:array[0..63]of fvec3;// normal-vector array
i:longint;//index counter
durchschnitt_normal:fvec3;//der durchnitts normal
minimal_negative_cosinus:single;// minimaler cosinus zwischen durchnitts normal und der normal-vector array
temp_cosinus:single;
begin
//die normal-vektoren sind schon in "normals" array kalkuliert worden (durch die phong interpolation oder tangent space matrix)
//berechne durchschnitts-normal der normals-array
durchschnitt_normal=fvec3 (0);
for i:=0to63do durchschnitt_normal+=normals[i];
normalize (durchschnitt_normal);
//berchne minimalen cosinus, die grenze, wo minimal ein normal-vector von der normals-array zum licht zeigt
if minimal_negative_cosinus>temp_cosinus then minimal_negative_cosinus:=temp_cosinus;
end;
minimal_negative_cosinus-=1;//wir brauchen noch 90 grad weil die fleche von licht von jeder seite zwishen 0 und 90 grad winkel sichtbar ist ;cos (0)-cos(90)=1
for i:=0to tile_num_of_lights do
begin
if dotproduct (pararell_licht_normal [i],durchschnitt_normal)< minimal_negative_cosinus thencontinue;
///////////////////////
//hier wird die per-pixel beleuchtung berechnet ...
//////////////////////
end;
Ok ich habe loesung fuer die pararell-lichter. Aber was ist mit punkt-lichter? Da kommt ins spiel die pixel und licht position in world-space. Jedes pixel hat gegen den licht anderen normal-vektor. Hat jemand eine idee?
_________________ Mich interesiert es nicht in welcher sprache du programmiers. Mich interesiert, was du in dieser sprache programmieren kannst.
Zuletzt geändert von Lord Horazont am Mo Sep 19, 2011 22:12, insgesamt 1-mal geändert.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.