Я не программист Android, но я предполагаю, что он использует OpenGL-ES, в котором эти функции устарели (и, кстати, отсутствуют).
Учебники, объясняющие хорошее решение, нарисованы среди множества другихкоторые показывают, как рисовать треугольники с функциями glVertex3f (потому что это дает простые и быстрые результаты, но совершенно бессмысленно).Я нахожу это трагичным, поскольку НИКТО не должен использовать эти вещи.
glBegin / glEnd, glVertex3f, glTexcoords2f, и такие функции в настоящее время устарели из-за производительности (они "медленные", потому что мы должны ограничить количество вызововграфическая библиотека).Я не буду подробно останавливаться на этом, так как вы можете найти его, если интересно.Вместо этого используйте буферы Vertex и Indices.Я извиняюсь, потому что у меня нет "идеальной" ссылки, чтобы рекомендовать, но вы легко можете получить то, что вам нужно на google:)
Тем не менее, я выкопал некоторые из древнего проекта C #:
- Примечание: привязка OpenTK меняет имя функции, но остается очень близкой к OGL, например, glVertex3f становится GL.Vertex3.
Определение вершины
Простая структура для хранения информации вашей пользовательской вершины (позиция, нормаль (если необходимо), цвет ...)
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)]
public struct Vertex
{
public Core.Math.Vector3 Position;
public Core.Math.Vector3 Normal;
public Core.Math.Vector2 UV;
public uint Coloring;
public Vertex(float x, float y, float z)
{
this.Position = new Core.Math.Vector3(x, y, z);
this.Normal = new Core.Math.Vector3(0, 0, 0);
this.UV = new Core.Math.Vector2(0, 0);
System.Drawing.Color color = System.Drawing.Color.Gray;
this.Coloring = (uint)color.A << 24 | (uint)color.B << 16 | (uint)color.G << 8 | (uint)color.R;
}
}
Класс буфера вершин
Это класс-оболочка для OpenGLобъект буфера для обработки нашего формата вершин.
public class VertexBuffer
{
public uint Id;
public int Stride;
public int Count;
public VertexBuffer(Graphics.Objects.Vertex[] vertices)
{
int size;
// We create an OpenGL buffer object
GL.GenBuffers(1, out this.Id); //note: out is like passing an object by reference in C#
this.Stride = OpenTK.BlittableValueType.StrideOf(vertices); //size in bytes of the VertexType (Vector3 size*2 + Vector2 size + uint size)
this.Count = vertices.Length;
// Fill the buffer with our vertices data
GL.BindBuffer(BufferTarget.ArrayBuffer, this.Id);
GL.BufferData(BufferTarget.ArrayBuffer, (System.IntPtr)(vertices.Length * this.Stride), vertices, BufferUsageHint.StaticDraw);
GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size);
if (vertices.Length * this.Stride != size)
throw new System.ApplicationException("Vertex data not uploaded correctly");
}
}
Класс буфера индексов
Очень похож на буфер вершин, он хранит индексы вершин каждой грани вашей модели.
public class IndexBuffer
{
public uint Id;
public int Count;
public IndexBuffer(uint[] indices)
{
int size;
this.Count = indices.Length;
GL.GenBuffers(1, out this.Id);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, this.Id);
GL.BufferData(BufferTarget.ElementArrayBuffer, (System.IntPtr)(indices.Length * sizeof(uint)), indices,
BufferUsageHint.StaticDraw);
GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size);
if (indices.Length * sizeof(uint) != size)
throw new System.ApplicationException("Indices data not uploaded correctly");
}
}
Буферы рисования
Затем для рендеринга треугольника необходимо создать один буфер вершин для хранения позиций вершин.Один буфер Indice, содержащий индексы вершин [0, 1, 2] (обратите внимание на правило против часовой стрелки, но то же самое с методом glVertex3f). Когда закончите, просто вызовите эту функцию с указанными буферами.Обратите внимание, что вы можете использовать несколько наборов индексов с одним вершинным буфером для визуализации только нескольких граней каждый раз.
void DrawBuffer(VertexBuffer vBuffer, IndexBuffer iBuffer)
{
// 1) Ensure that the VertexArray client state is enabled.
GL.EnableClientState(ArrayCap.VertexArray);
GL.EnableClientState(ArrayCap.NormalArray);
GL.EnableClientState(ArrayCap.TextureCoordArray);
// 2) Bind the vertex and element (=indices) buffer handles.
GL.BindBuffer(BufferTarget.ArrayBuffer, vBuffer.Id);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, iBuffer.Id);
// 3) Set up the data pointers (vertex, normal, color) according to your vertex format.
GL.VertexPointer(3, VertexPointerType.Float, vBuffer.Stride, new System.IntPtr(0));
GL.NormalPointer(NormalPointerType.Float, vBuffer.Stride, new System.IntPtr(Vector3.SizeInBytes));
GL.TexCoordPointer(2, TexCoordPointerType.Float, vBuffer.Stride, new System.IntPtr(Vector3.SizeInBytes * 2));
GL.ColorPointer(4, ColorPointerType.UnsignedByte, vBuffer.Stride, new System.IntPtr(Vector3.SizeInBytes * 3 + Vector2.SizeInBytes));
// 4) Call DrawElements. (Note: the last parameter is an offset into the element buffer and will usually be IntPtr.Zero).
GL.DrawElements(BeginMode.Triangles, iBuffer.Count, DrawElementsType.UnsignedInt, System.IntPtr.Zero);
//Disable client state
GL.DisableClientState(ArrayCap.VertexArray);
GL.DisableClientState(ArrayCap.NormalArray);
GL.DisableClientState(ArrayCap.TextureCoordArray);
}
Надеюсь, это поможет;)