Как нарисовать треугольник с помощью OpenTK?

Я не уверен, почему этот код просто не рисует треугольник на экране (орфографически). Я использую OpenTK 1.1, это то же самое, что и OpenGL 1.1.

List<Vector3> simpleVertices = new List<Vector3>();
simpleVertices.Add(new Vector3(0,0,0));
simpleVertices.Add(new Vector3(100,0,0));
simpleVertices.Add(new Vector3(100,100,0));

GL.MatrixMode(All.Projection);
GL.LoadIdentity();

GL.MatrixMode(All.Projection);
GL.Ortho(0, 480, 320, 0,0,1000);

GL.MatrixMode(All.Modelview);
GL.LoadIdentity();
GL.Translate(0,0,10);
unsafe
{
  Vector3* data = (Vector3*)Marshal.AllocHGlobal(
                        Marshal.SizeOf(typeof(Vector3)) * simpleVertices.Count);

  for(int i = 0; i < simpleVertices.Count; i++)
  {
    ((Vector3*)data)[i] = simpleVertices[i];
  }

  GL.VertexPointer(3, All.Float, sizeof(Vector3), new IntPtr(data));
  GL.DrawArrays(All.Triangles, 0, simpleVertices.Count);
}

Код выполняется один раз в каждом цикле обновления в функции рисования. То, что я думаю, что я делаю (но, очевидно, это не так), создает набор вершин положения для формирования треугольника и рисует его в 10 единицах перед камерой.

Почему этот код не рисует треугольник?


person meds    schedule 17.05.2011    source источник
comment
Что произойдет, если вы поменяете верхнее и нижнее значения на вызов Ortho: GL.Ortho(0, 480, 0, 320, 0, 1000);?   -  person Jackson Pope    schedule 17.05.2011
comment
Вы должны сбросить представление модели до идентичности перед применением этого перевода. В противном случае с каждой итерацией рендеринга вы переводите его дальше.   -  person datenwolf    schedule 17.05.2011
comment
Вы имеете в виду вставку в «GL.LoadIdentity()» после GL.MatrixMode(All.ModelView)? Просто добавил, что сейчас...   -  person meds    schedule 17.05.2011


Ответы (1)


В OpenGL ось Z направлена ​​за пределы экрана, поэтому при записи

GL.Translate(0,0,10);

он фактически переводит его «перед» экраном.

Теперь ваши два последних параметра для GL.Ortho равны 0,1000. Это означает, что все от 0 до 1000 в направлении МИНУС Z (= перед камерой) будет отображаться.

Другими словами, GL.Translate(0,0,-10); поместит ваш объект перед камерой, а GL.Translate(0,0,10); — сзади.

person Calvin1602    schedule 18.05.2011