计算OpenGL C (Gouraud阴影)中的顶点正常
calculating vertex normal in opengl c++ ( gouraud shading)
我刚刚开始学习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)
。但是有无限的可能性!
相关文章:
- 如何循环打印顶点结构
- D3D11-将混合权重和索引传递到顶点着色器
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 如何将一半传递给顶点着色器?
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 使用 OpenGL 4.5 更改所选顶点的颜色
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 创建异构顶点数据数组的可移植方法
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- C++声明模板参数阴影模板参数错误
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- DirectX 11 - 点光源阴影
- OpenGL 相机移动程序顶点着色器问题
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- 为什么顶点数组对象会导致错误?
- 计算OpenGL C (Gouraud阴影)中的顶点正常
- 在opengl阴影映射中存储纹理中的顶点深度信息