2016-01-02 3 views
-1

Недавно я создал этот класс VertexBuffer и добавил его в мой механизм, основанный на opengl; но это, кажется, не в состоянии в моей основной код, в результате чего ...Проблемы с буфером вершин

Вот VertexBuffer.h «нарушение прав доступа по адресу 0x00000000.»:

#pragma once 

#include "Type.h" 
#include "Tags.h" 

namespace Spiky { 
namespace GLLayer { 

template<> 
struct GLObjDelAlloc<Tags::VertexBuffer> { 
    static void Allocate(GLTypeCT<GLType::Integer> count, 
         Tags::VertexBuffer::internal* names) { 
    glGenBuffers(count, names); 
    } 
    static void Delete(GLTypeCT<GLType::Integer> count, Tags::VertexBuffer::internal* names) { 
    glDeleteBuffers(count, names); 
    } 
}; 
template<> 
struct GLObjBind<Tags::VertexBuffer> { 
private: 
    static Tags::VertexBuffer::internal _active; 
public: 
    static const int ZERO_BUFFER = GL_NONE; 
    static void BindRequest(Tags::VertexBuffer::internal name = ZERO_BUFFER) { 
    if(_active != name) { 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 
     _active = name; 
    } 
    } 
}; 
Tags::VertexBuffer::internal 
GLObjBind<Tags::VertexBuffer>::_active = 0; 

//wrapper around GLObjDelAlloc & GLObjBind 
class VertexBuffer { 
public: 
    explicit VertexBuffer() { 
    GLObjDelAlloc<Tags::VertexBuffer>::Allocate(1, &handle_); 
    } 
    inline void Bind() { 
    GLObjBind<Tags::VertexBuffer>::BindRequest(handle_); 
    } 

    template<typename T> 
    static void BufferData(const GLTypeCT<GLType::Integer> count, GLTypeCT<T>* data) { 
    glBufferData(GL_ARRAY_BUFFER, count * 
     sizeof(data->stride), data, GL_STATIC_DRAW); 
    } 

    VertexBuffer& operator=(const VertexBuffer& other) = delete; 
    VertexBuffer(const VertexBuffer& other) = delete; 
private: 
    Tags::VertexBuffer::internal handle_; 
}; 

} //namespace GLLayer 
} //namespace Spiky 

А вот мое главное:

int main(int argc, char** args) 
{ 


    GLTypeCT<GLfloat> quadVertices[] = { 
    // Positions  // Texture Coords 
    -1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 
    1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 
    }; 

    // Setup plane VAO 
    glGenVertexArrays(1, &quadVAO); 
    VertexBuffer buffer{}; 
    glBindVertexArray(quadVAO); 
    buffer.Bind(); 
    VertexBuffer::BufferData(12, quadVertices); 

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 
    (GLvoid*)(0)); 

    glBindVertexArray(0); 

    auto RenderQuad = [&] { 
    glBindVertexArray(quadVAO); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    glBindVertexArray(0); 
    }; 

    //render calls later on... 

} 

Считаете ли вы, что ошибка исходит от VertexBuffer?

+2

Где находится это нарушение доступа, согласно отладчику? Также: убедитесь, что все ваши вызовы GL преуспевают (cfr. 'GlGetError'), и что очистка выполнена правильно (я не вижу развязки для VBO). –

+1

Используете ли вы библиотеку glew? – Rabbid76

+0

@Marco A1) VS сообщает мне, что ошибка исходит от glDrawArrays(); 2) cout-ing glGeterror, я получил ошибку # 1280; означает ли это что-нибудь? – Coder32

ответ

0

Здесь я вижу несколько возможных проблем.

Но во-первых, 1280 означает GL_INVALID_ENUM, где вы это получили? После чего вызов opengl?

В этом:

static void BindRequest(Tags::VertexBuffer::internal name = ZERO_BUFFER) { 
if(_active != name) { 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    _active = name; 
} 

Вы, вероятно, следует передать glBindBuffer то, что вы хотите связать. glBindBuffer(GL_ARRAY_BUFFER, name)

Я сомневаюсь, что это вызывает к краху, но, когда вы звоните glVertexAttribPointer вы передаете его 3 * sizeof(float), когда он должен быть 6 * sizeof(float), почему? Поскольку шаг должен быть размером всей вашей «Вершины», которая в вашем случае содержит позиции и текскоды, которые суммируются до 6 поплавков.

И когда вы звоните glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) вы говорите, что отсчет 4, но, насколько я знаю, это только 2.

«Нарушение прав доступа в 0x00000000», вы получите, что если функции указатель на эту функцию не был извлечен, что вы используете для получения этих указателей? Я видел в комментариях, что вы используете SDL, но ничего не сделаете для вас. Вы можете сделать это самостоятельно или использовать GLEW.

+0

Спасибо :) Сейчас он работает! – Coder32

+0

2) 3 * sizeof (float) на самом деле нормально, потому что я использую только вершинные позиции: это для рендеринга fullScreen quad, поэтому я могу просто вызвать glFragCoord; но я оставил texCoords только для целей отладки :) – Coder32

+0

3) Только последний вопрос; вы думаете, что неплохо обернуть VertexBuffer в такой класс? Есть ли у вас какие-либо предложения по улучшению? – Coder32

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