2016-09-26 3 views
-1

Я пытаюсь отобразить треугольник, используя VBOs в OpenGL через C++.Opengl - Треугольник не будет рендерить?

Во-первых, я определяю свои переменные:

CBuint _vao; 
CBuint _vbo; 
CBuint _ebo; 

struct Vertex 
{ 
    CBfloat position[3]; 
}; 

Затем я поставил позиции для каждой вершины, образуя геометрический треугольник:

Vertex v[3]; 
v[0].position[0] = 0.5f; 
v[0].position[1] = 0.5f; 
v[0].position[2] = 0.0f; 

v[1].position[0] = 0.5f; 
v[1].position[1] = -0.5f; 
v[1].position[2] = 0.0f; 

v[2].position[0] = -0.5f; 
v[2].position[1] = -0.5f; 
v[2].position[2] = 0.0f; 

достаточно просто, не так ли? Тогда я объявляю мои показатели для EBO/IBO:

unsigned short i[] = 
{ 
    0, 1, 2 
}; 

Теперь у меня есть все данные атрибутов, необходимых для буферизации, я связываю с ВАО, а также РВО:

// Generate vertex elements 
glGenVertexArrays(1, &_vao); 
glGenBuffers(1, &_vbo); 
glGenBuffers(1, &_ebo); 

// VAO 
glBindVertexArray(_vao); 

// VBO 
glBindBuffer(GL_ARRAY_BUFFER, _vbo);  
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 9, &v, GL_STATIC_DRAW); 

// EBO 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short) * 3, &i, GL_STATIC_DRAW); 

// Location 0 - Positions 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0)); 

glBindVertexArray(0); 

Следующая я сделать их:

glBindVertexArray(_vao); 
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 
glBindVertexArray(0); 

затем я использую вершинный шейдер:

#version 330 core 

// Vertex attributes 
layout(location = 0) in vec3 position; 

// Node parses 
out vec3 Fragpos; 

// Uniforms 
uniform mat4 model; 
uniform mat4 projection; 
uniform mat4 view; 

// Vertex loop 
void main() 
{ 
    gl_Position = projection * view * model * vec4(position, 1.0f); 
    Fragpos = vec3(model * vec4(position, 1.0f)); 
} 

Чтобы просто рассчитать положение модели, а также вид камеры. Пиксельный шейдер снова, весьма упрощенно:

#version 330 core 

// Node parses 
out vec4 color; 
in vec3 Fragpos; 

// Camera data 
uniform vec3 view_loc; 

// Global uniforms 
uniform struct GLOBAL 
{ 
    float ambient_coefficient; 
    vec3 ambient_colour; 
} _global; 

// Main loop 
void main(void) 
{ 
    color = vec4(1.0, 1.0, 1.0, 1.0); 
} 

Мундиров работает прекрасно, как я использую этот шейдерный код для предыдущих проектов. Так в чем проблема? Треугольник просто не отображает. Я не могу думать ни о чем, что вызывает это, какие-то идеи?

Click here to view the end result. Edit: Просто, чтобы сузить вещи вниз, я также использовать эти переменные для обработки матрицы модели, которая в настоящее время анализироваться и из вершинного шейдера:

CBuint _u_model; 

mat4 _model; 
vec3 _position; 
vec4 _rotation; 
vec3 _scale; 

Тогда внутри конструктора, я инициализировать переменные следующим образом:

_model = mat4::identity(); 
_position = vec3(0.0f, 0.0f, 0.0f); 
_rotation = vec4(0.0f, 1.0f, 0.0f, 0.0f); 
_scale = vec3(1.0f, 1.0f, 1.0f); 

_u_model = glGetUniformLocation(shader->_program, "model"); 

И, наконец, обновить матрицу модели, используя эту формулу:

_model =   translate(_position) * 
        rotate(_rotation.data[0], _rotation.data[1], _rotation.data[2], _rotation.data[3]) * 
        scale(_scale); 

Edit 2: Это класс камеры я использую для MVP:

class Camera : public object 
{ 
private: 
    CBbool  _director; 
    CBfloat  _fov; 
    CBfloat  _near; 
    CBfloat  _far; 
    CBfloat  _speed; 
    Math::vec3 _front; 
    Math::vec3 _up; 
    Math::mat4 _projection; 
    Math::mat4 _view; 

    CBuint  _u_projection; 
    CBuint  _u_view; 

public: 
    Camera(Shader* shader, Math::vec3 pos, float fov, float n, float f, bool dir) : _speed(5.0f) 
    { 
     _model = Math::mat4::identity(); 
     _projection = Math::mat4::identity(); 
     _view = Math::mat4::identity(); 

     _position = pos; 
     _fov = fov; 
     _near = n; 
     _far = f; 
     _director = dir; 
     _front = vec3(0.0f, 0.0f, -1.0f); 
     _up = vec3(0.0f, 1.0f, 0.0f); 

     _u_projection = glGetUniformLocation(shader->_program, "projection"); 
     _u_view = glGetUniformLocation(shader->_program, "view"); 
     _u_model = glGetUniformLocation(shader->_program, "view_loc"); 
    } 

    ~Camera() {} 


    inline CBbool isDirector()   { return _director; } 

    inline void forward(double delta) { _position.data[2] -= _speed * (float)delta; } 
    inline void back(double delta)  { _position.data[2] += _speed * (float)delta; } 
    inline void left(double delta)  { _position.data[0] -= _speed * (float)delta; } 
    inline void right(double delta)  { _position.data[0] += _speed * (float)delta; } 
    inline void up(double delta)  { _position.data[1] += _speed * (float)delta; } 
    inline void down(double delta)  { _position.data[1] -= _speed * (float)delta; } 

    virtual void update(double delta) 
    { 
     _view = Math::lookat(_position, _position + _front, _up); 
     _projection = Math::perspective(_fov, 900.0f/600.0f, _near, _far); 
    } 

    virtual void render() 
    { 
     glUniformMatrix4fv(_u_view, 1, GL_FALSE, _view); 
     glUniformMatrix4fv(_u_projection, 1, GL_FALSE, _projection); 
     glUniform3f(_u_model, _position.data[0], _position.data[1], _position.data[2]); 
    } 
}; 
+0

Хорошо, не заметив, что полная программа трудно сказать, но правильно ли вы создали свою программу (шейдер)? Как вы инициализировали свою форму (проецирование, просмотр и модель)? Просто, чтобы сузить возможности, в вашем вершинном шейдере, выполните: 'gl_Position = vec4 (position, 1.0f);' – Amadeus

+0

Спасибо за ваш ответ, я отредактировал вопрос выше ^. Я проверю gl_position = vec4 (position, 1.0f); чтобы увидеть, если это проблема, спасибо! – DrStrange

+0

О, ничего себе! Оно работает! Спасибо Вам большое! : D Ты спас мне столько времени, спасибо !!! – DrStrange

ответ

0

Как Amadeus говорил, я просто должен был использовать gl_Position = vec4(position, 1.0f); для его визуализации. Не знаю, почему, но сейчас самое время узнать! Спасибо за ваше время.

+0

, потому что вы не правильно инициализировали свои равномерные матрицы (проекция, просмотр и модель).Другими словами, просто сделайте их равными тождеству – Amadeus

+0

Да, я действительно использую эти три формы в классе камеры, я сделаю второе редактирование и покажу вам, что у меня есть – DrStrange

+0

Кажется, что просто игнорируют значения, установленные для униформы MVP : S – DrStrange

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