OpenGL重叠式丑陋渲染

Kiw*_*une 5 opengl opengl-compat

我正在尝试使用OpenGL 2.1渲染场景,但是重叠形状上的边框很奇怪。我测试了一些OpenGL初始化,但是没有任何变化。我将问题简化为一个2球的简单测试应用程序,结果相同。

我尝试了有关Gl_DEPTH_TEST的几件事,启用/禁用平滑操作均未成功。

这是我用2 gluSphere的结果:

在此处输入图片说明

当一条线足以分隔蓝色和红色面时,我们可以看到某种混叠...

我使用SharpGL,但我认为它并不重要(因为我仅将其用作OpenGL包装器)。这是我渲染最简单的代码(可以将其复制到Form中进行测试):

OpenGL gl;
IntPtr hdc;
int cpt;

private void Init()
{
    cpt = 0;
    hdc = this.Handle;

    gl = new OpenGL();
    gl.Create(SharpGL.Version.OpenGLVersion.OpenGL2_1, RenderContextType.NativeWindow, 500, 500, 32, hdc);

    gl.Enable(OpenGL.GL_DEPTH_TEST);
    gl.DepthFunc(OpenGL.GL_LEQUAL);

    gl.ClearColor(1.0F, 1.0F, 1.0F, 0);
    gl.ClearDepth(1);

    gl.MatrixMode(OpenGL.GL_PROJECTION);
    gl.Perspective(30, 1, 0.1F, 1.0E+7F);

    gl.MatrixMode(OpenGL.GL_MODELVIEW);
    gl.LookAt(0, 3000, 0, 0, 0, 0, 0, 0, 1);
}

private void Render(int angle)
{
    gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT | OpenGL.GL_STENCIL_BUFFER_BIT);

    RenderSphere(gl, 0, 0, 0, 0, 300, Color.Red);
    RenderSphere(gl, 0, 0, 100, angle, 300, Color.Blue);

    gl.Blit(hdc);
}

private void RenderSphere(OpenGL gl, int x, int y, int z, int angle, int radius, Color col)
{
    IntPtr obj = gl.NewQuadric();

    gl.PushMatrix();
    gl.Translate(x, y, z);
    gl.Rotate(angle, 0, 0);

    gl.Color(new float[] { col.R / 255f, col.G / 255f, col.B / 255f, col.A / 255f });
    gl.QuadricDrawStyle(obj, OpenGL.GLU_FILL);
    gl.Sphere(obj, radius, 20, 10);

    gl.Color(new float[] { 0, 0, 0, 1 });
    gl.QuadricDrawStyle(obj, OpenGL.GLU_SILHOUETTE);
    gl.Sphere(obj, radius, 20, 10);

    gl.DeleteQuadric(obj);

    gl.PopMatrix();
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的建议!

编辑:

我测试没有成功:

gl.Enable(OpenGL.GL_LINE_SMOOTH);
gl.Enable(OpenGL.GL_POLYGON_SMOOTH);
gl.ShadeModel(OpenGL.GL_SMOOTH);

gl.Hint(OpenGL.GL_LINE_SMOOTH_HINT, OpenGL.GL_NICEST);
gl.Hint(OpenGL.GL_POLYGON_SMOOTH_HINT, OpenGL.GL_NICEST);
gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_NICEST);
Run Code Online (Sandbox Code Playgroud)

EDIT2:有更多的面孔,有线条和无线条的图像

在此处输入图片说明

这是……与众不同……但并不令人愉悦。

Kiw*_*une 3

解决方案 1(不是一个好的方案):应用于gl.Scale(0.0001, 0.0001, 0.0001);ModelView 矩阵

解决方案2:近平面要尽可能远,避免z值压缩在小范围内。在这种情况下,使用 10 而不是 0.1 就足够了。最好是根据对象距离计算调整值(在本例中,最近的对象位于 2700)

我认为我们可以关注z is stored non-linearly@PikanshuKumar 链接和隐含的后果。

结果:仅面被线切割:赤道处有一条直线作为分隔符。 在此输入图像描述

当我们增加面数时,这些线条就会如预期消失。在此输入图像描述