0

我正在遵循一些 NeHe 教程(将其翻译为 OpenTK)和我在网上找到的用于绘制三角形的 OpenTK 示例(用于简单的初始设置)之间进行交叉:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Diagnostics;
using System.IO;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using System.Windows.Forms;

namespace GravSimBasic
{
    class GLMain : GameWindow
    {
        int vbo;
        Vector3[,] vertices;

        float time = 0.01f;

        void CreateVertexBuffer()
        {
            vertices = new Vector3[2,3];
            vertices[0,0] = new Vector3(-1f, -1f, (float)Math.Sin(time));
            vertices[0, 1] = new Vector3(0.5f, -1f, (float)Math.Sin(time));
            vertices[0, 2] = new Vector3(-0.25f, 1f, -(float)Math.Sin(time));
            vertices[1, 0] = new Vector3(-0.5f, -1f, (float)Math.Cos(time));
            vertices[1, 1] = new Vector3(1f, -1f, (float)Math.Cos(time));
            vertices[1, 2] = new Vector3(0.25f, 1f, -(float)Math.Cos(time));

            //MessageBox.Show("Length: " + vertices.Length.ToString());

            GL.GenBuffers(1, out vbo);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                                   new IntPtr(vertices.Length * Vector3.SizeInBytes),
                                   vertices, BufferUsageHint.StaticDraw);
        }

        protected override void OnLoad(EventArgs e)
        {
            //set the window area
            GL.Viewport(0, 0, 400, 400);
            //background color
            GL.ClearColor(Color.Black);
            //set the view area
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            GL.Ortho(-2, 2, -2, 2, 2, -2);
            //now back to 'scene editing' mode
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            //make things look nice
            GL.ShadeModel(ShadingModel.Smooth);

            //set up our z-rendering logic
            GL.ClearDepth(2.0000f);
            GL.Enable(EnableCap.DepthTest);
            GL.DepthFunc(DepthFunction.Lequal);

            //other improvements to quality
            GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
            GL.Hint(HintTarget.LineSmoothHint, HintMode.Nicest);
            //initialize our scene data
            CreateVertexBuffer();

        }

        protected override void OnRenderFrame(FrameEventArgs e)
        {
            time += 0.01f;
            vertices[0, 0].Z = (float)Math.Sin(time);
            vertices[0, 1].Z = (float)Math.Sin(time);
            vertices[0, 2].Z = -(float)Math.Sin(time);
            vertices[1, 0].Z = (float)Math.Cos(time);
            vertices[1, 1].Z = (float)Math.Cos(time);
            vertices[1, 2].Z = -(float)Math.Cos(time);
            GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                                   new IntPtr(vertices.Length * Vector3.SizeInBytes),
                                   vertices, BufferUsageHint.StaticDraw);
            System.Threading.Thread.Sleep(10);



            GL.Clear(ClearBufferMask.ColorBufferBit);

            GL.EnableVertexAttribArray(0);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            GL.Color4(0.75f,0.0f,0.0f,0.25f);
            GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0);

            GL.DrawArrays(BeginMode.Triangles, 0, 3);

            GL.Color4(0.0f, 0.75f, 0.0f, 0.55f);
            GL.VertexAttribPointer(3, 3, VertexAttribPointerType.Float, false, 0, 0);
            GL.DrawArrays(BeginMode.Triangles, 3, 3);

            GL.DisableVertexAttribArray(0);

            SwapBuffers();
        }
    }
}

我怀疑问题出在第 58-60 行,但我已经在 -2.0、0.00001 和 2.0 之间更改了第 58 行的值,但没有一个改变结果。不过,它可能是前面几行的透视设置。我已经尝试了几乎所有可用作第 60 行参数的函数 - Lequal 似乎是我所期望的最佳选择,它确实产生了最接近我想要的结果,但它并不完全正确。

设置:有一个绿色和红色的三角形。它们在 xy 轴上部分重叠。一个的顶部 z 轴由 -sin(time) 函数映射,底部为 sin(time) 函数。另一个使用 cos() 代替 sin,但在其他方面是相同的。“时间”值会改变每次渲染。

我想要/期望的:两个重叠的三角形——一个红色,一个绿色。当它来回旋转时,每个的非重叠部分应该始终可见,重叠部分应该只显示最前面的三角形。

我得到的是:(a)什么都没有(b)两个三角形的显示,一个在另一个之上。(c) 一个三角形的位的变化图像,两个三角形或一个三角形都没有 - 即使一个或两个都显示,是任何一个三角形的位,应该是可见的,但是丢失了(背景)。

如果我删除时间,它会显示正确的快照 - 下半部分前面的红色三角形,顶部前面的绿色。

任何人都可以帮助诊断这个吗?

4

1 回答 1

2

在第 86 行,您只清除颜色缓冲区,而不是深度缓冲区,因此对 58 的任何更改都不会产生任何影响:

 GL.Clear(ClearBufferMask.ColorBufferBit);

我从未使用过 OpenTK,但我想它需要遵循以下原则:

 GL.Clear(ClearBufferMask.ColorBufferBit|ClearBufferMask.DepthBufferBit);
于 2012-10-06T16:07:07.283 回答