Это генерирует 25 главных вершин.Индекс Буферный объект и УФ-координаты не играют хорошо
For x As Single = -1 To 1 Step 0.5F
For y As Single = 1 To -1 Step -0.5F
Dim pt1 As New Vector3(x, y, 0)
tFloats.Add(pt1)
Next
Next
Это индексы, что составляет 16 плиток из 32 треугольников, я на самом деле их создания, но это первая строка:
Dim inasd() As Integer = {
0, 2, 10,
2, 10, 12,
10, 12, 20,
12, 20, 22,
20, 22, 30,
22, 30, 32
}
Теперь я пытаюсь применить текстуру каждый треугольник, 1 текстура на плитку. 16 различных текстур.
Теперь моя проблема заключается в том, что, когда я использую
GL.DrawRangeElements(PrimitiveType.Triangles, 0, indices.Length - 1, 6, DrawElementsType.UnsignedShort, New IntPtr(0))
Вместо того, чтобы идти по УФ-данных и использовать его как (0,1,2) (3,4,5) (6, 7,8) вместо этого следует данные индекса и захватывает УФ-шнуры, такие как (0,2,10) (2,10,12) (10,12,20), поэтому для того, чтобы это сделать, я сделал следующее:
Dim UV_Data(12) As Vector2
UV_Data(0) = New Vector2(0.0F, 1.0F)
UV_Data(2) = New Vector2(0.0F, 0.0F)
UV_Data(10) = New Vector2(1.0F, 1.0F)
UV_Data(12) = New Vector2(1.0F, 0.0F)
Это отлично работает, на первой плитки. На второй плитке, потому что она идет (10,12,20), она использует UV_Data (10) в качестве верхнего левого угла треугольника, который является верхним правым углом на текстуре, поэтому он не работает. В любом случае я могу избавиться от индексации на УФ, но не от вершины? Потому что это просто вызывает такую головную боль для меня, иначе что я могу сделать?
EDIT:
данные вершин и UV данных аров хранятся в двух отдельных буферов, как это:
GL.GenBuffers(1, FloatBuffer)
GL.BindBuffer(BufferTarget.ArrayBuffer, FloatBuffer)
GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(floats.Length * Vector3.SizeInBytes), floats, BufferUsageHint.StaticDraw)
GL.GenBuffers(1, UVBuffer)
GL.BindBuffer(BufferTarget.ArrayBuffer, UVBuffer)
GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(UV_Data.Length * Vector2.SizeInBytes), UV_Data, BufferUsageHint.StaticDraw)
Они получают видеокарты, как это:
GL.EnableVertexAttribArray(0)
GL.BindBuffer(BufferTarget.ArrayBuffer, FloatBuffer)
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, False, 0, 0)
GL.EnableVertexAttribArray(1)
GL.BindBuffer(BufferTarget.ArrayBuffer, UVBuffer)
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, False, 0, 0)
Я также имеют буфер индексов:
GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndicesBuffer)
Затем нарисован с помощью кода Gl.DrawRangeElements выше.
Мои вершинные шейдеры:
#version 330 core
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;
// Output data ; will be interpolated for each fragment.
out vec2 UV;
// Values that stay constant for the whole mesh.
void main(){
// Output position of the vertex, in clip space : MVP * position
gl_Position.xyz = vertexPosition_modelspace;
gl_Position.w = 1;
// UV of the vertex. No special space for this one.
UV = vertexUV;
}
Мой пиксельный шейдер:
#version 330 core
// Interpolated values from the vertex shaders
in vec2 UV;
// Ouput data
out vec3 color;
// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;
void main(){
// Output color = color of the texture at the specified UV
color = texture2D(myTextureSampler, UV).rgb;
}
EDIT 2: Можно ли редактировать UV данных во время рендеринга, например:
Dim UV_Data(indices.Length) As Vector2
For i As Integer = 0 To 1
UV_Data(indices(i)) = New Vector2(0.0F, 1.0F)
UV_Data(indices(i + 1)) = New Vector2(0.0F, 0.0F)
UV_Data(indices(i + 2)) = New Vector2(1.0F, 1.0F)
UV_Data(indices(i + 3)) = New Vector2(1.0F, 0.0F)
'GL.BindBuffer(BufferTarget.ArrayBuffer, UVBuffer)
GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(UV_Data.Length * Vector2.SizeInBytes), UV_Data, BufferUsageHint.DynamicDraw)
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, False, 0, 0)
'GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndicesBuffer)
GL.BindTexture(TextureTarget.Texture2D, mapTextures.Item(i))
GL.DrawRangeElements(PrimitiveType.Triangles, 0, indices.Length - 1, 6, DrawElementsType.UnsignedShort, New IntPtr(i * 12))
Next
Пусть сила будет с вами. –
В каких буферах вы хранили ваши данные UV и данные вершин, как вы их передаете на свою графическую карту и как вы описываете буферы для вашей шейдерной программы? – Vengarioth
Я отредактировал вопрос с ответами на эти вопросы. –