//Achtung, dies ist nur Pseudocode! Die Syntax //muss noch gepimpt werden! //Für transpose() etc. die internen Hilfsroutinen von WebGL //benutzen //Alle eckigen Klammern sind nur für den allgemeinen Fall //(mehr als 1 Licht, mehr als 1 Objekt) //und nur für die Zusatzaufgaben nötig vec3 lichtpos[nlicht]; //Position der Lichtquelle vec3 lichtspec[nlicht]; //Spekularer Anteil RGB vec3 lichtdiff[nlicht]; //Diffuser Anteil RGB scalar lichtatt0[nlicht],lichtatt1[nlicht],lichtatt2[nlicht]; //Abschwächung vec3 ambient; //Ambienter Anteil RGB vec3 kspec[nobj]; //Spekular Materialk. RGB vec3 kdiff[nobj]; //Diffuser Materialk. RGB vec3 kamb[nobj]; //Ambienter Materialk. RGB scalar nexp; //Spekularer Exponent transformk=matrix1*matrix2*... //Transformiert in Kamerakoordinaten transformki=inverse(transpose(transformk)); //Für die Normalen normalsk[nobj]=normals[nobj]*transformki; lichtposk[nlicht]=lichtposk[nlicht]*transformk; vertexk[nobj]=vertexk[nobj]*transformk; reflectk[nobj,nlicht]=2*normalsk[nobj]-lichtposk[nlicht]; reflectk[nobj,nlicht]=tounit(reflectk[nobj,nlicht]); //auf 1 normieren distl[nobj,nlicht]=vertexk[nobj]-lichtpos[nlicht]; distw[nobj,nlicht]=absolute(distl[nobj,nlicht]); //Länge des Vektors fatt[nobj,nlicht]=min(0,1./(lichtatt0[nlicht]+lichtatt1[nlicht]*distw[nobj,nlicht]+lichtatt2[nlicht]*distw[nobj,nlicht]^2)); ispec[nobj,nlicht]=lichtspec[nlicht]*kspec[nobj]*max(0.,dot(normalsk[obj],lichtposk[nlicht]))^n; idiff[nobj,nlicht]=lichtdiff[nlicht]*kdiff[nobj]*max(0.,dot(reflectk[obj,nlicht],vertexk[obj]); iamb[nobj]=ambient*kamb[nobj]; iges[nobj]=iamb[nobj]+sum-über-licht(fatt[nobj,nlicht]*(ispec[nobj]+idiff[nobj])); //Code passend in Shader einfügen