计算OpenGL C (Gouraud阴影)中的顶点正常

calculating vertex normal in opengl c++ ( gouraud shading)

本文关键字:顶点 阴影 OpenGL Gouraud 计算      更新时间:2023-10-16

我刚刚开始学习C 和OpenGL。我正在尝试计算OpenGL中的顶点正常。

我知道有一个函数glNormal3f。但是,我不允许使用该功能。相反,我必须用代码和OBJ文件计算正常的顶点。因此,我要做的是,我首先计算表面正态,然后计算出正常的顶点。

我声明了运算符,例如+,-,*和其他功能,例如innerproduct, crossproduct

void calcul_color(){
VECTOR kd;
VECTOR ks;
kd=VECTOR(0.8, 0.8, 0.8);
ks=VECTOR(1.0, 0.0, 0.0);
double inner =  kd.InnerProduct(ks);
int i, j;
for(i=0;i<cube.vertex.size();i++)
{
    VECTOR n = cube.vertex_normal[i];
    VECTOR l = VECTOR(100,100,0) - cube.vertex[i];
    VECTOR v = VECTOR(0,0,1) - cube.vertex[i];
    float xl = n.InnerProduct(l)/n.Magnitude();
    VECTOR x = (n * (1.0/ n.Magnitude())) * xl;
    VECTOR r = x - (l-x);
    VECTOR color = kd * (n.InnerProduct(l)) + ks * pow((v.InnerProduct(r)),10);
    cube.vertex_color[i] = color;
}


for(i=0;i<cube.face.size();i++)
    {
        FACE cur_face = cube.face[i];
glColor3f(cube.vertex_color[cur_face.id1].x,cube.vertex_color[cur_face.id1].y,cube.vertex_color[cur_face.id1].z);
            glVertex3f(cube.vertex[cur_face.id1].x,cube.vertex[cur_face.id1].y,cube.vertex[cur_face.id1].z);
            glColor3f(cube.vertex_color[cur_face.id2].x,cube.vertex_color[cur_face.id2].y,cube.vertex_color[cur_face.id2].z);
            glVertex3f(cube.vertex[cur_face.id2].x,cube.vertex[cur_face.id2].y,cube.vertex[cur_face.id2].z);
            glColor3f(cube.vertex_color[cur_face.id3].x,cube.vertex_color[cur_face.id3].y,cube.vertex_color[cur_face.id3].z);
            glVertex3f(cube.vertex[cur_face.id3].x,cube.vertex[cur_face.id3].y,cube.vertex[cur_face.id3].z);
    }

计算顶点正常的方法是:

  • 将每个顶点初始化为(0,0,0)
  • 对于每个脸部计算脸部正常fn,将其标准化
  • 脸部的每个顶点都会在顶点正常
  • 中添加fn
  • 之后,循环使每个顶点正常
  • 正常化

这个循环是一个不错的O(n)。要注意这里的一件事是,如果共享顶点,那么正常的人会像在球体上一样平滑。如果未共享顶点,您会像在多维数据集中一样获得硬面。复制此类顶点应在之前进行。

如果您的问题是关于如何从正常变为颜色,那取决于您的照明方程!最简单的做法是:color = dot(normal,globallightdir)*globallightcolor另一种方法是color = texturecubemap(normal)。但是有无限的可能性!