#c# #opengl #xamarin.ios #monodevelop #opentk
#c# #opengl #xamarin.ios #monodevelop #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 единицах перед камерой.
Почему этот код не рисует треугольник?
Комментарии:
1. Что произойдет, если поменять местами верхнее и нижнее значения при вызове Ortho:
GL.Ortho(0, 480, 0, 320, 0, 1000);
?2. Вы должны сбросить modelview на identity перед применением этого перевода. В противном случае с каждой итерацией рендеринга вы переводите его дальше.
3. Ты имеешь в виду вставить ‘GL. LoadIdentity()’ после GL.MatrixMode(All.ModelView)? Только что добавил это сейчас…
Ответ №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);
он будет располагаться позади.