【问题标题】:Opengl - Triangle won't render?Opengl - 三角形不会渲染?
【发布时间】:2017-02-04 02:29:41
【问题描述】:

我正在尝试通过 C++ 在 OpenGL 中使用 VBO 渲染三角形。

首先,我确定我的变量:

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
};

现在我有了缓冲所需的所有属性数据,我绑定了 VAO 以及 VBO:

// 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);
}

制服工作得非常好,因为我在以前的项目中一直使用这个着色器代码。那么问题可能是什么?三角形根本不渲染。我想不出是什么原因造成的,有什么想法吗?

编辑:只是为了缩小范围,我还使用这些变量来处理正在解析到顶点着色器和从顶点着色器解析出来的模型矩阵:

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);

编辑 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]);
    }
};

【问题讨论】:

  • 好吧,没有看到完整的程序很难说,但是,你有没有正确地构建你的程序(着色器)?你是如何初始化你的制服(投影、视图和模型)的?只是为了缩小可能性,在你的顶点着色器中,做:gl_Position = vec4(position, 1.0f);
  • 感谢您的回复,我已经编辑了上面的问题^。我将测试 gl_position = vec4(position, 1.0f);看看是不是这个问题,谢谢!
  • 哇哦!有用!真的非常感谢你! :D 你为我节省了很多时间,谢谢!!!

标签: c++ opengl graphics vbo vao


【解决方案1】:

正如 Amadeus 提到的,我只需要使用 gl_Position = vec4(position, 1.0f); 来渲染它。不知道为什么,但现在是找出答案的时候了!感谢您的宝贵时间。

【讨论】:

  • 因为您没有正确初始化统一矩阵(投影、视图和模型)。换句话说,只要让它们等于身份
  • 是的,我实际上在相机课上使用了这三件制服,我将进行第二次编辑并展示我所拥有的
  • 似乎只是忽略了为 MVP 制服设置的值:S
  • 在渲染 EBO 之前我没有得到模型制服!现在可以了,感谢您的帮助!
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多