我在跟踪一些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行,但我已将第58行中的值更改为-2.0,0.00001和2.0之间,没有更改结果。不过,它可能是前几行的透视设置。 我已经尝试了几乎所有可用的功能作为第60行的参数 - Lequal似乎是我期望的最佳选择,它确实产生了我想要的最接近的结果,但它不太正确。
设置:有一个绿色和红色三角形。它们在x-y轴上部分重叠。一个的顶部z轴由-sin(时间)函数映射,底部是sin(时间)函数。另一个使用cos()而不是sin,但在其他方面是相同的。 'time'值会改变每次渲染。
我想要/期望:两个重叠的三角形 - 一个红色,一个绿色。当它来回旋转时,每个的非重叠部分应始终可见,重叠部分应仅显示最前面的三角形。
我得到了什么: (a)什么都没有 (b)显示两个三角形,一个在另一个之上。 (c)三角形中的一个,两个或没有一个三角形的位变化图像 - 即使一个或两个都显示,任何三角形的位,应该是可见的,缺失的(背景)。
如果我删除时间,它会显示正确的快照 - 下半部分前面的红色三角形和顶部前面的绿色。
任何人都可以帮助诊断吗?
答案 0 :(得分:2)
在第86行,您只清除颜色缓冲区,而不是深度缓冲区,因此对58的任何更改都不会产生任何影响:
GL.Clear(ClearBufferMask.ColorBufferBit);
我从未使用过OpenTK,但我猜它需要按照以下方式进行:
GL.Clear(ClearBufferMask.ColorBufferBit|ClearBufferMask.DepthBufferBit);