我的程序中有剥离曲面的问题。
我使用OpenGL(Tao)渲染一些曲面。我使用triangle_strip。 为了获得良好的3D效果,我使用了灯光。我正确设置了法线。
起初我使用了crossProduct,现在我使用了隐式函数的推导。两种方法似乎都给出了正确的结果,因为精确度,推导可能会更好。我在表面看到垂直条纹。条带中的两个相邻三角形具有不同的色调/阴影。 1,3,5,7 ......和2,4,6 ......具有相同的色调/色调。视角越小,差异越大。在90°时没关系。
我怎样摆脱条纹?
在这里你可以看到图片:
初始化:
private float[] materialAmbient = { 1.0f, 1.0f, 1.0f, 1.0f };
private float[] materialDifuse = { 0.6f, 0.6f, 0.6f, 1.0f };
private float[] materialOdlesky = { 0.2f, 0.2f, 0.2f, 1.0f };
private float[] materialShininess = { 50.0f };
private float[] light_position = { 0.0f, 0.0f, 1.0f, 1.0f};
private float[] light_color = { 0.7f, 0.7f, 0.7f }
Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_NICEST);
Gl.glDepthFunc(Gl.GL_LESS);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, materialAmbient);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, materialDifuse);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, materialOdlesky);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, materialShininess);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light_position);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, light_color);
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
绘图代码:
double foo = 15;
for (double v = -foo; v < foo; v += vStep)
{
if (v > foo - vStep)
v = foo - vStep;
Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
Gl.glColor3dv(_color);
for (double u = -foo; u < foo + uStep; u += uStep)
{
if (u > foo)
u = foo;
SetVextexAndHisNormal(u, v);
SetVextexAndHisNormal(u, v + vStep);
if (u == foo)
break;
}
Gl.glEnd();
if (v == foo - vStep)
break;
}
public void SetVextexAndHisNormal(double u, double v)
{
Vector v1 = ComputeCoordinatesAt(u, v);
double x = (-2 / (_a + _a)) * v1.GetX();
double y = (2 / (_b + _b)) * v1.GetY();
double z = -2*_k;
Vector normal = new Vector(x, y, z);
normal.NornVector();
Gl.glNormal3d(_normalSign * normal.GetX(), _normalSign * normal.GetY(), _normalSign * normal.GetZ());
Gl.glVertex3d(v1.GetX(), v1.GetY(), v1.GetZ());
}