OpenGL VBO Drawing

Кажется, у меня возникают проблемы при рисовании объектов в OpenGL с использованием VBO. Я попытался скопировать пример из: http://www.opengl.org/wiki/VBO_-_just_examples (номер 2), но я не могу заставить самолет появиться на экране.

Vertex.h:

#include <freeglut>

struct Vertex {
GLfloat position[3];
GLfloat normal[3];
GLfloat *uvs[2];
unsigned short uvCount;
};

Triangles.h:

#include <GL/glew.h>
#include "Vertex.h"
class Triangles {
public:
Triangles(GLuint program, Vertex *vertices, unsigned int vertexCount, unsigned int *indices[3], unsigned int indiceCount);
~Triangles();
void Draw();

private:
GLuint program;
GLuint VertexVBOID;
GLuint IndexVBOID;
GLuint VaoID;

unsigned int *indices[3];
unsigned int indiceCount;
};

Triangles.cpp:

#include "Triangles.h"#include <stdio.h>
#include <stddef.h>

Triangles::Triangles(GLuint program, unsigned int *indices[3], unsigned int indiceCount) {
memcpy(this->indices, indices, sizeof(int) * indiceCount * 3);
this->indiceCount = indiceCount;
this->program = program;

glGenVertexArrays(1, &VaoID);
glBindVertexArray(VaoID);

glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertexCount, vertices, GL_STATIC_DRAW);

GLuint attributeLocation = glGetAttribLocation(program, "position");
glEnableVertexAttribArray(attributeLocation);
glVertexAttribPointer(attributeLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)(offsetof(Vertex, position)));

attributeLocation = glGetAttribLocation(program, "normal");
glEnableVertexAttribArray(attributeLocation);
glVertexAttribPointer(attributeLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)(offsetof(Vertex, normal)));

glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 3 * indiceCount, indices, GL_STATIC_DRAW);
};

Triangles::~Triangles() {
glDisableVertexAttribArray(glGetAttribLocation(program, "position"));
glDisableVertexAttribArray(glGetAttribLocation(program, "normal"));

glDeleteBuffers(1, &VertexVBOID);
glDeleteBuffers(1, &IndexVBOID);
glDeleteVertexArrays(1, &VaoID);
}

void Triangles::Draw() {
glBindVertexArray(VaoID);
glDrawElements(GL_TRIANGLES, indiceCount, GL_UNSIGNED_INT, 0);
};

Выдержка из main.cpp (создание объекта triagle):

Vertex vertices[4];
vertices[0].position[0] = -1;
vertices[0].position[1] = 1;
vertices[0].position[2] = 0;
vertices[0].normal[0] = 0;
vertices[0].normal[0] = 0;
vertices[0].normal[0] = 1;
vertices[0].uvCount = 0;

vertices[1].position[0] = 1;
vertices[1].position[1] = 1;
vertices[1].position[2] = 0;
vertices[1].normal[0] = 0;
vertices[1].normal[0] = 0;
vertices[1].normal[0] = 1;
vertices[1].uvCount = 0;

vertices[2].position[0] = 1;
vertices[2].position[1] = -1;
vertices[2].position[2] = 0;
vertices[2].normal[0] = 0;
vertices[2].normal[0] = 0;
vertices[2].normal[0] = 1;
vertices[2].uvCount = 0;

vertices[3].position[0] = -1;
vertices[3].position[1] = -1;
vertices[3].position[2] = 0;
vertices[3].normal[0] = 0;
vertices[3].normal[0] = 0;
vertices[3].normal[0] = 1;
vertices[3].uvCount = 0;

unsigned int **indices;
indices = new unsigned int*[2];
indices[0] = new unsigned int[3];
indices[0][0] = 0;
indices[0][1] = 1;
indices[0][2] = 2;
indices[1] = new unsigned int[3];
indices[1][0] = 2;
indices[1][1] = 3;
indices[1][2] = 0;

Triangles *t = new Triangles(program, vertices, 4 indices, 2);

createShader (GLenum, char *):

GLuint createShader(GLenum type, char *file) {
GLuint shader = glCreateShader(type);
const char *fileData = textFileRead(file);
glShaderSource(shader, 1, &fileData, NULL);

glCompileShader(shader);
return shader;
}

Загрузка шейдера:

    GLuint v = createShader(GL_VERTEX_SHADER);
GLuint f = createShader(GL_FRAGMENT_SHADER, "fragmentShader.frag");

program = glCreateProgram();

glAttachShader(program, v);
glAttachShader(program, f);
glLinkProgram(program);

glUseProgram(program);

vertexShader.vert:

in vec3 position;
in vec3 normal;

out vec3 a_normal;

void main() {
gl_Position = vec4(position, 1.0);
}

fragmentShader.frag:

in vec3 a_normal;

out vec4 out_color;

void main() {
out_color = vec4(1.0, 1.0, 1.0, 1.0);
}

Пожалуйста, дайте мне знать, если вам нужно больше кода. Как примечание стороны, все компилируется просто отлично, я просто не вижу плоскость, которую я построил на экране (возможно, потому что я не использовал цвета?)

Моя информация OpenGL выглядит следующим образом:

  • Поставщик: ATI Technologies Inc.
  • Рендерер: ATI Radeon HD 5700 Series
  • Версия: 3.2.9756 Контекст профиля совместимости
  • Расширения: расширения = GL_AMDX_name_gen_delete GL_AMDX_random_access_target GL_AMDX_vertex_shader_tessellator GL_AMD_conservative_depth GL_AMD_draw_buffers_blend GL_AMD_performance_monitor GL_AMD_setex_trade_set_set_MD

0

Решение

В ответ на ваши комментарии:

К сожалению, я не делаю проверку ошибок

Вам следует всегда добавьте проверку ошибок OpenGL, это избавит вас от многих проблем. Это должно выглядеть примерно так:

int err = glGetError();
if(err != 0) {
//throw exception or log message or die or something
}

Я использовал матричные функции, потому что я не знал, что вершинный шейдер повлияет на это. Я предположил, что матрица установлена ​​на матрицу в верхней части стека (ту, которую я вставил перед рисованием.)

Это неверное предположение. Единственная переменная, которая ссылается на устаревший стек матрицы, — это специальная (хотя и не рекомендуемая) переменная. gl_ModelViewProjectionMatrix, В настоящее время у вас есть только неиспользованная неинициализированная матрица, которая полностью игнорирует ваш стек матриц.

Что касается показателей, я не совсем уверен, что вы имеете в виду. Я просто нарисовал вершины на бумаге и решил, что индексы основаны на этом.

Я не имею в виду индексы треугольника в вашем индексном буфере, а скорее первый параметр для ваших функций glAttrib *. Я полагаю, «местоположение атрибута» является более правильным термином, чем индекс.

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ...   //attrib location 0

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, ...   //attrib location 1

Вы, кажется, просто случайно предполагаете, что «0» и «1» соответствуют «положению» и «нормальному». Это не безопасное предположение. Вы должны запросить значения местоположения атрибута для «position» и «normal» с помощью glGetAttribLocation, а затем использовать это значение для glEnableVertexAttribArray и glVertexAttribPointer.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]