VBO на OpenGL ES 2.0 ничего не показывает

Я изучаю OpenGL ES. Я успешно нарисовал несколько кубов, поняв базовую логику матриц для определения местоположения камеры и т. д. Прямо сейчас я пытаюсь построить пример для VBO, но он ничего не рисует на экране. Я вставлю свой код, возможно, кто-то поймет, что я делаю неправильно.

Код фрагментного шейдера

precision mediump float;
varying vec2 v_texCoord;
varying vec3 v_colour; 
uniform sampler2D s_texture;    
void main() 
{ 
 gl_FragColor = texture2D(s_texture, v_texCoord);
}

Вершинный шейдер

attribute vec3 av3position;
attribute vec2 a_texCoord; 
attribute vec3 av3colour;

uniform mat4 PerspectiveMatrix;
uniform mat4 ModelViewMatrix;

varying vec2 v_texCoord; 
varying vec3 v_colour;

void main() 
{ 
v_texCoord = a_texCoord; 
v_colour =av3colour;
vec4 pos = ModelViewMatrix * vec4(av3position,1.0);
gl_Position = PerspectiveMatrix * pos;
}

Загрузка текстуры

Texture01RGBA->boLoadTextureFromfile("BitmapData/cubeLayout_02.png" );

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);         // Use tightly packed data
glGenTextures(1, &gluiTextureID);              // Generate a texture object
glBindTexture(GL_TEXTURE_2D, gluiTextureID);   // Bind the texture object
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Texture01RGBA->getWidth(), Texture01RGBA->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, Texture01RGBA->getPixmapPointer()); 
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);     
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glActiveTexture ( GL_TEXTURE0 );
glBindTexture ( GL_TEXTURE_2D, gluiTextureID );
// Set the sampler texture unit to 0
glUniform1i ( iLoc2DSampler, 0 );

Структура вершинного объекта

const float aCubeVertices[] =
{ // x, y, z, nx, ny, nz, u, v
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.500000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.250000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.250000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.500000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.750000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.750000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 1.000000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 1.000000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.750000, 0.250000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.750000, 0.000000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.500000, 0.250000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.250000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.000000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.000000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.250000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.250000, 0.250000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.250000, 0.000000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.250000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.750000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.500000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.500000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.750000
};

unsigned short aCubeIndices[]= // 36 Elements. 3 Groups
{  0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23 };

Создание ВБО

glGenBuffers (1, &vao);
glBindBuffer  (GL_ARRAY_BUFFER, vao);

glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float)*8, aCubeVertices, GL_STATIC_DRAW);
glBindBuffer (GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &vinx);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vinx);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36* sizeof(GLushort), aCubeIndices, GL_STATIC_DRAW);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);

Чертеж ВБО

glBindBuffer  (GL_ARRAY_BUFFER, vao);
  // set up vertex attributes
  glEnableVertexAttribArray(iLocPosition);
  glEnableVertexAttribArray(iLocTexCoord);
  glVertexAttribPointer(iLocPosition, 3, GL_FLOAT, GL_FALSE, sizeof(float)*8, 0);
  glVertexAttribPointer(iLocTexCoord, 2, GL_FLOAT, GL_FALSE, sizeof(float)*8,  (const void *)24  );
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vinx);
  glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (void*)0);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  glDisableVertexAttribArray(iLocPosition);
  glDisableVertexAttribArray(iLocTexCoord);

Как я указывал ранее, я использовал в основном тот же код для предыдущих более простых примеров, которые я сделал (текстуры, матрицы преобразования). Я также проверил наличие ошибок, и ошибок в коде нет.

Буду признателен, если кто-нибудь подчеркнет, что может быть не так с моим кодом.


person maza    schedule 28.10.2012    source источник
comment
Мне кажется, что вы в значительной степени уловили правильную идею, ничто не выскакивает на меня как неправильное. Если вы переключитесь с VBO на использование базовых массивов вершин (без gl*Buffer), сработает ли это для вас? Это может помочь, если вы сможете точно определить, где ваш код перестает работать.   -  person Tim    schedule 29.10.2012


Ответы (2)


Ваш буфер вершин (или, по крайней мере, ваш индексный буфер) кажется неправильным. Например, первый треугольник определяется индексами 0, 1, 2, которые соответствуют следующим вершинам:

 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.500000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.250000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.250000,

Как видите, положение первой и второй вершин одинаковое (1,1,1). В результате получается вырожденный треугольник (треугольник без площади), который невозможно отобразить.

person Benlitz    schedule 29.10.2012

Код, который вы показываете здесь, выглядит правильно. Проблема может быть в других частях кода. Одним из источников ошибок может быть то, как вы настраиваете представление модели и матрицу перспективы. Другим может быть что-то не так с тем, как вы устанавливаете свои униформы glUniform*() (возможно, несоответствие большинства строк/столбцов вашим матрицам и тому, как этого ожидает OpenGL). Если бы вы могли вставить этот код, у нас была бы полная картина. Я предполагаю, что данные вершин и индексов для куба верны, поскольку вы упомянули, что уже нарисовали кубы раньше.

person ds-bos-msk    schedule 07.05.2013