c++ - OpenGL顶点数组不渲染

标签 c++ opengl

我正在尝试使用 opengl 绘制一些基本三角形,但它没有在屏幕上呈现。这些是相关的功能:

glewInit();
glClearColor(0.0, 0.0, 0.0, 1.0);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
Vertex vertices[] = {Vertex(Vector3f(0.0, 1.0, 0.0)),
                     Vertex(Vector3f(-1.0, -1.0, 0.0)),
                     Vertex(Vector3f(1.0, -1.0, 0.0))};

mesh.addVertices(vertices, 3);

Pastebin 链接到 Vertex.hpp 和 Vector3f.hpp:

Vertex.hpp

Vector3f.hpp

/* 
 * Mesh.cpp:
 */
Mesh::Mesh()
{
    glGenBuffers(1, &m_vbo); // unsigned int Mesh::m_vbo
}

void Mesh::addVertices(Vertex vertices[4], int indexSize)
{
    m_size = indexSize * 3;
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glBufferData(GL_ARRAY_BUFFER, m_size, vertices, GL_STATIC_DRAW);
}

void Mesh::draw()
{
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(Vertex), 0);
    glDrawArrays(GL_TRIANGLES, 0, m_size);
    glDisableVertexAttribArray(0);
}

如果我调用 glClear 它只是黑色,否则只是默认窗口的随机噪音。我可以用最原始的方法让它画一个三角形:

glBegin(GL_TRIANGLES);
glColor3f(0.4, 0.0, 0.0);
glVertex2d(0.0, 0.5);
glVertex2d(-0.5, -0.5);
glVertex2d(0.5, -0.5);
glEnd();

这有效并显示了它应该正确执行的操作,所以我想这至少表明我的应用程序没有 100% 失败。我正在学习的教程是用 Java 编写的,我正在将它翻译成 C++ SFML,所以我想可以这么说,翻译过程中可能会丢失一些东西,除非我只是遗漏了一些非常基本的东西(更多可能。)

我们如何解决这个问题,以便它使用 Vertex 列表来绘制三角形?

最佳答案

错误太多了。确实有很多例子,用任何语言都可以,那为什么呢?

const float pi = 3.141592653589793;Vector3f的成员域。您是否意识到这是非静态成员并且它包含在您使用的每个 Vector3f 中,因此您的 vector 实际上有四个元素 - x、y、z 和 pi?您是否通知 GL,以便它可以跳过这些垃圾数据?我不这么认为。

您使用 glVertexAttribPointer,但没有事件着色器。不能保证位置在插槽 0 中。要么使用 glVertexPointer,要么使用位置属性绑定(bind)到 0 的着色器。

void Mesh::addVertices(Vertex vertices[4], int indexSize) [4] 在这里应该是什么意思?虽然这不是错误,但至少是误导。

glBufferData(GL_ARRAY_BUFFER, m_size, vertices, GL_STATIC_DRAW); 在您的示例中,m_size 是 3*3,而文档说它应该是以字节为单位的数组大小 - 这是sizeof(Vertex) * indexSize

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(Vertex), 0); 为什么 stride 参数是 4*sizeof(Vertex) ?将其设置为 0 或写入正确的步幅 - 即 sizeof(Vertex)

glDrawArrays(GL_TRIANGLES, 0, m_size); m_size 已经 [错误地] 设置为“顶点缓冲区大小”,而 DrawArrays 需要绘制的顶点数 - 这是 m_size/sizeof (顶点)(假设 m_size 计算正确)。

关于c++ - OpenGL顶点数组不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24431033/

相关文章:

c++ - 自定义类的 unordered_set 是否有默认的哈希函数?

c++ - 在 Mac OSX 中以编程方式阻止屏幕保护程序

c++ - 这个归并排序算法做了多少次比较?

c - 链接头文件: Matlab Engine and OpenGL

opengl - 如何在 Clarion 中正确传递数组地址?

opengl - Z轴什么时候翻转? (OpenGL)

opengl - 将 Webkit 渲染成 GL 纹理

c++ - 结构尺寸定义

基于宏函数参数的c++宏输出类型

c++ - boost::可选抽象类类型