我使用头发粒子系统使用 Blender 2.66 创建了一个发型。这看起来像这样:
如您所见,亮度已应用于线条片段。转换后,我已将发型网格导出为 OBJ 文件格式。我在我的程序中解析了它,渲染看起来像这样:
粒子已绘制为 GL_LINES(在我的 OBJ 文件中,每个面有 2 个顶点)。
在另一个测试程序中,我想用一个简单的线段来测试亮度。这是我的顶点缓冲区:
static GLfloat vertices[6] =
{
0.000000f, 0.000000f, -2.000000f,
0.000000f, 0.000000f, 2.000000f
};
static GLfloat normals[6] =
{
0.000000f, 1.000000f, 0.000000f,
0.000000f, 1.000000f, 0.000000f
};
static GLfloat colors[6] =
{
0.000000f, 0.000000f, 1.000000f,
0.000000f, 0.000000f, 1.000000f
};
结果(线在原点垂直于X轴旋转->我调用glLineWidth(5.0f)以获得更好的可见结果):
通过实时动画,我可以看到亮度是正确的,但只是在线条的特定“一侧”。这是正常的,因为一条线段应该有无限的法线,而我只有两条法线(每个顶点一个)。我想确切地说这两个法线是方程平面的法线 Y = 0 -> n(0.0, 1.0, 0.0)。所以我想知道是否可以为每个顶点添加多个法线?我相信 OpengL 做不到。但也许另一种方式是可能的。这是一张图,解释了我想做什么来计算线段每个部分的正确亮度:
就像您在第一张图片上看到的那样,Blender 可以在线段上实时计算亮度。此外,这张图片上存在 OpenGL 渲染。所以我确信这是可能的。我尝试重复相同的线段坐标两次,但对于第二行,我应用了相反的法线 n2(0.0, -1.0, 0.0) 但它不起作用。“另一面”是“黑暗的”。两个多边形也是一样的。目前,我使用 GLSL 着色器。我认为使用几何着色器或镶嵌着色器等特殊着色器是可能的。也许需要 CUDA 语言。但我不确定。
有人可以帮助我吗?