2014-01-12 3 views
0

Это генерирует 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 
+0

Пусть сила будет с вами. –

+0

В каких буферах вы хранили ваши данные UV и данные вершин, как вы их передаете на свою графическую карту и как вы описываете буферы для вашей шейдерной программы? – Vengarioth

+0

Я отредактировал вопрос с ответами на эти вопросы. –

ответ

1

index применяется к данным и атрибутам вершин и данных текстур. Об этом нет. Например, в простом 4-квад-массиве он может работать, как показано ниже.

вар backgroundObj = [ -1, -1, -1, 1, -1, -1, 1,1, -1, -1,1, -1 ];

вар backgroundObjTexCoords = [ 0.000000, 0.000000, 1.000000, 0.000000,
1.000000, 1.000000, 0.000000, 1.000000 ];

var backgroundObjIndices = [ 0,1,2, 0,2,3 ];

EDIT1:

triangle strip image,

Если взять противоположный поток, как в изображении выше, треугольники будут следовать порядку 012, 213, 234 и т.д. Вы должны генерировать вершины таким образом, даже если делать вручную.

+0

Что только делает 1 квад? Что, если я хочу сделать еще один квадрат рядом с ним, используя вершины 1 и 2? он будет получать неправильные текс-коды для этого? –

+0

Если вы не делаете что-то вручную (и этот способ разделения не прав), инструменты будут давать соседние края для продолжения следующего квада. Например, порядок в вашем случае будет как [0,3,2, 0,2,1, (следующий квад), 1,2,4 и т. Д. – prabindh

+0

Я не использую инструменты, хотя ... Я просто создавая квадроциклы. –

Смежные вопросы