Итак, я пытаюсь создать базовый класс «Drawable», который обрабатывает много чертежа для меня в фоновом режиме, и я хочу использовать современный OpenGL (без начального и конечного операторов). Когда я запускаю draw(), я просто получаю пустой экран.OPENGL: Квадратный класс с использованием VBO
Я запустил отладчик и проверил, мой массив правильно инициализирован 3xFLOAT для позиции и 4xFLOAT для цвета. Любая идея, что происходит не так? Я очень новичок в этой библиотеке. Мой пример пытается нарисовать красный куб на (+ -0.5, + -0.5, 0.0), поэтому массив indexData - это просто {0, 1, 2, 3}.
#define DRAWABLE_VERTEX_DEPTH 3
#define SIZE_OF_VERTEX_ELEMENT sizeof(GLfloat)
#define VERTEX_SIZE (DRAWABLE_VERTEX_DEPTH * SIZE_OF_VERTEX_ELEMENT)
#define DRAWABLE_COLOR_DEPTH 4
#define SIZE_OF_COLOR_ELEMENT sizeof(GLfloat)
#define COLOR_SIZE (DRAWABLE_COLOR_DEPTH * SIZE_OF_COLOR_ELEMENT)
#define INDEX_SIZE sizeof(GLushort)
#define DRAWABLE_STRIDE (VERTEX_SIZE + COLOR_SIZE)
inline Drawable(/*Arguments omitted for brevity...*/)
{
//Standard initialization omitted....
glGenBuffers(1, &vboID);
glGenBuffers(1, &vioID);
glGenVertexArrays(1, &vaoID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vioID);
glBufferData(GL_ARRAY_BUFFER, (VERTEX_SIZE + COLOR_SIZE) * vertexCount, vertexData, drawType);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, INDEX_SIZE * indexCount, indexData, drawType);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//Generate Vertex Array
glBindVertexArray(vaoID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, DRAWABLE_VERTEX_DEPTH, GL_FLOAT, GL_FALSE, DRAWABLE_STRIDE, 0);
glVertexAttribPointer(1, DRAWABLE_COLOR_DEPTH, GL_FLOAT, GL_FALSE, DRAWABLE_STRIDE, (GLbyte*)VERTEX_SIZE);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vioID);
glBindVertexArray(0);
}
inline void draw()
{
glBindVertexArray(vaoID);
glDrawElements(drawMode, indexCount, GL_UNSIGNED_SHORT, NULL);
glBindVertexArray(0);
}
GLSL Vertex Shader:
#version 430\r\n
in layout(location=0) vec3 inPosition;
in layout(location=1) vec4 inColor;
out vec4 outVertexColor;
void main()
{
gl_Position = vec4(inPosition, 1.0);
outVertexColor = inColor;
}
GLSL фрагмент Shader:
#version 430\r\n
in vec4 outVertexColor;
out vec4 outFragmentcolor;
void main()
{
outFragmentcolor = outVertexColor;
}
Вы должны вызвать 'glEnableClientState (GL_VERTEX_ARRAY);' перед вызовом 'glBindVertexArray (vaoID);' и 'glDisableClientState (GL_VERTEX_ARRAY);' после 'glBindVertexArray (0);'. – ProXicT
Thx для ответа! Я просто добавил это, но это, казалось, не имело никакого эффекта. Что именно это делает? И нужно ли мне это в обоих местах, где я привязываю Vertex Array? – guitar80
Я просто быстро просмотрел ваш код и нашел это пропавшим. Он в основном включает/отключает возможность, указанную в параметре. Попробуйте поставить 'glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); вместо этого. И не забудьте снова отключить его. – ProXicT