在角度下观察时,Opengl剥离表面

时间:2013-03-01 14:17:07

标签: opengl

我的程序中有剥离曲面的问题。

我使用OpenGL(Tao)渲染一些曲面。我使用triangle_strip。 为了获得良好的3D效果,我使用了灯光。我正确设置了法线。

起初我使用了crossProduct,现在我使用了隐式函数的推导。两种方法似乎都给出了正确的结果,因为精确度,推导可能会更好。我在表面看到垂直条纹。条带中的两个相邻三角形具有不同的色调/阴影。 1,3,5,7 ......和2,4,6 ......具有相同的色调/色调。视角越小,差异越大。在90°时没关系。

我怎样摆脱条纹?

在这里你可以看到图片: enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

初​​始化:

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());
    }

0 个答案:

没有答案