【发布时间】:2016-08-14 18:51:22
【问题描述】:
目前我正在尝试通过网格类绘制三角形。为此,我首先初始化 glew 并调用 Window 类的 Window.initializeGraphics 方法,然后创建一个顶点数组并传递给我的 Mesh.addVerticies 方法。每个顶点有 3 个浮点数,x、y 和 z。然后我在主游戏循环的每个滴答声中调用 Mesh.draw 方法。
initializeGraphics 方法:
void Window::initializeGraphics()
{
glClearColor(0, 0, 0, 0);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_FRAMEBUFFER_SRGB);
}
创建网格:
m_Mesh = Mesh();
Vertex data[] = { Vertex(vec3(-1, -1, 0)),
Vertex(vec3(1, -1, 0)),
Vertex(vec3(0, 1, 0)) };
m_Mesh.addVerticies(data);
网头:
#include "vertex.h"
#include <GLEW\glew>
class Mesh
{
private:
GLuint m_Vbo;
int m_Size;
public:
Mesh();
void addVerticies(Vertex verticies[]);
void draw();
};
网格 C++ 文件:
#include "mesh.h"
Mesh::Mesh()
{
glGenBuffers(1, &m_Vbo);
}
void Mesh::addVerticies(Vertex verticies[])
{
m_Size = (sizeof(verticies) / sizeof(*verticies));
glBindBuffer(GL_ARRAY_BUFFER, m_Vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);
}
void Mesh::draw()
{
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, m_Vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * 4, 0);
glDrawArrays(GL_TRIANGLES, 0, m_Size);
glDisableVertexAttribArray(0);
}
顶点标题:
#include "vec3.h"
struct Vertex
{
union
{
vec3 pos;
struct
{
float x, y, z;
};
};
Vertex(vec3 pos_);
};
顶点 C++ 文件:
#Include "vertex.h"
Vertex::Vertex(vec3 pos_)
{
pos = pos_;
}
渲染方法:
void MainComponent::render()
{
m_Window.clear();
m_Mesh.draw();
m_Window.update();
}
//m_Window.update();
void Window::update()
{
glfwSwapBuffers(m_GLFWWindow);
glfwPollEvents();
}
//m_Window.clear();
void Window::clear()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
问题是,屏幕上没有出现三角形。我究竟做错了什么 ?我几乎还是一个 C++ 新手,这是我第一次编写 OpenGl,所以它可能是我一直忽略的非常基本的东西。
提前感谢您的努力。
-肖恩
【问题讨论】:
-
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW)。检查 sizeof(vertices) 的值是否正确。另外,着色器代码在哪里?
-
@PedroDavid 也不需要解决这个问题,谢谢。但我找到了它没有渲染的原因。