Я знаю, что это, вероятно, лучше использовать VBO вместо этого, но у меня есть личные причины, чтобы использовать вершинные массивы (кроме моего любопытства)Использование вершинных массивов с OpenTK
В C++ используется здесь вершинные массивы:
// "vertices" is an array of Vertex Struct
const char* data = reinterpret_cast<const char*>(vertices);
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), data + 0));
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), data + 8));
glColorPointer(4, GL_FLOAT, sizeof(Vertex), data + 16));
glDrawArrays(GL_QUADS, 0, vertexCount);
указатель прошел и работал красиво на C++, однако я не могу заставить его работать на C# с OpenTK. Я последовал за official documentation и в конечном итоге с этим кодами:
Vertex[] vertices = // .. Fill some vertex here
unsafe
{
fixed (Vertex* data = vertices)
{
GL.VertexPointer(2, VertexPointerType.Float, Vertex.Stride, new IntPtr(data + 0));
GL.TexCoordPointer(2, TexCoordPointerType.Float, Vertex.Stride, new IntPtr(data + 8));
GL.ColorPointer(4, ColorPointerType.Float, Vertex.Stride, new IntPtr(data + 16));
// Draw the Vertices
GL.DrawArrays(PrimitiveType.Quads,
0,
vertices.length);
GL.Finish(); // Force OpenGL to finish rendering while the arrays are still pinned.
}
}
То, что я получил не только чистый белый, ничего отображается.
Я попытался использовать те же вершины с моей реализацией VBO, что и аналогичный код указателей вершин, он работает правильно, поэтому я думаю, что это не ошибка кода установки, и я уверен, что Vertex.Stride
возвращает действительный шаг Vertex
struct.
Любые идеи?
Учитывая ваш доказанный C++ навыки, это, возможно, проще сделать это в C++/CLI (включая WinForm) и использовать OpenGL как раз в том случае, если есть что-то напуганное с opentk. В частности, когда вы используете _pointers_ – MickyD
К сожалению, мне нужно придерживаться C# в этой ситуации. – SirusDoma
Попробуйте придерживаться примера грамматики: 1: 'Вершина * data = vertices' 2:' GL.VertexPoi ... stride, data) '' GL.ColorPoi ... stride, data + 16); ' –