我试图将Blinn Phong渲染为平面上的BRDF模型。我假设每个像素中的每一个法线都与平面垂直。我知道要进行渲染,我们必须使用3d编程API,如OpenGL或WebGL等等。
我的目的是在没有这些API的情况下渲染表面平面。我采取的步骤是,我创建了两个空格:
在矢量计算中,将图像空间的每个像素位置转换为摄像机空间,然后再转换为世界空间。
double[] cam=((new double[]{0,0,1}));
double[] lum=((new double[]{0,0,1}));
double[] E=new double[3];
double[] L=new double[3];
double[] H=new double[3];
double D2;
Mat image=new Mat(rows,cols,CvType.CV_8UC3);
System.out.println("Start!!");
System.out.println("ok");
for(int i=0;i<tileHNumber;i++)
{
for(int j=0;j<tileWNumber;j++)
{
for(int s=0;s<192;s++)
{
for(int t=0;t<192;t++)
{
originS=s+192*i;//ligne
originT=t+192*j;//colonne
double[] pos=(Image2Cam(new double[]{originT,originS,0}));
E=normalize(XY(cam,pos));
L=normalize(XY(lum, pos);
double[] le=addXY(L,E);
H=normalize(le);
D2=dot(E,E);
double blue=color(blueColor,pos,E,L,H,D2);
double green=color(greenColor,pos,E,L,H,D2);
double red=color(redColor,pos,E,L,H,D2);
image.put(originS, originT, new byte[]{(byte)(blue),(byte)(green),(byte)(red)});
}
}
}
}
public static double color(double col,double[] pos,double[] E,double[] L,double[] H,double D2)
{
double value=0;
double[] N=normalize((new double[]{pos[0],pos[1],1}));
double diffuse=Math.max(0, dot(N,L));
double specular=Math.pow(Math.max(0, dot(N,H)),60);
value=d*diffuse*0.5+0.2*d+specular*255*0.3;
return value;
}下面的两个图像显示了我的结果:第一个只显示漫射图像。第二幅只显示由白色表示的镜面图像。
我的问题是为什么镜片不是围绕着图像的中心。


发布于 2016-07-20 08:43:25
如果我猜对了,你画的是一个面对摄像机的平面,所以你的法线应该是0,0,-1。
变化
double[] N=normalize(新double[]{pos0,pos1,1});
至
double[] N=normalize((新double[]{0,0,-1}));
https://computergraphics.stackexchange.com/questions/3768
复制相似问题