gpt4 book ai didi

c++ - OpenGL:vertexArray 与 glBegin()

转载 作者:太空宇宙 更新时间:2023-11-04 13:09:29 25 4
gpt4 key购买 nike

我正在学习一些关于 OpenGL 的教程,但遇到了一个问题。我构建了一个名为 Mesh 的类,它在其构造函数中采用顶点数组并生成顶点数组等来进行绘图。问题是我什么也没看到。这是界面:

class Mesh
{
public:
Mesh(Vertex * vertices, size_t numVertices);
virtual ~Mesh();

void Draw();
private:
enum { POSITION_VB, NUM_BUFFERS };

GLuint m_vertexArrayObject;
GLuint m_vertexArrayBuffers;
size_t m_drawCount;
};

这里是实现

#include "mesh.h"

Mesh::Mesh(Vertex *vertices, size_t numVertices)
{
m_drawCount = numVertices;

glGenVertexArrays(1, &m_vertexArrayObject);
glBindVertexArray(m_vertexArrayObject);

glGenBuffers(NUM_BUFFERS, &m_vertexArrayBuffers);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers);
glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
}

void Mesh::Draw()
{
glBindVertexArray(m_vertexArrayObject);
glDrawArrays(GL_TRIANGLES, 0, m_drawCount);
glBindVertexArray(0);
}

Mesh::~Mesh()
{
glDeleteVertexArrays(1, &m_vertexArrayObject);
}

Vertex 类型是一个简单的类,看起来像

class Vertex {
public:
Vertex(glm::vec3 const & pos) { this->pos = pos;}
private:
glm::vec3 pos;
};

如果我将 Mesh::Draw() 的实现更改为

glBegin(GL_TRIANGLES);              
glVertex3f(-1.0f, -0.25f, 0.0f); //triangle first vertex
glVertex3f(-0.5f, -0.25f, 0.0f); //triangle second vertex
glVertex3f(-0.75f, 0.25f, 0.0f); //triangle third vertex
glEnd(); //end drawing of triangles

我在屏幕上打印了一个三角形。我的问题是:这是否一定意味着 Mesh 成员函数的实现存在错误,如果是这样,有人能发现吗?我想也许 glBegin 方法会绕过代码中其他地方的一些错误,而 vertexarray 方法无法绕过。如果有任何帮助,我将不胜感激。此外,如果需要,我可以发布其他代码!

着色器代码:

#version 120

void main()
{
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
}

最佳答案

很可能是您的 Mesh 类析构函数是罪魁祸首:

Mesh::~Mesh()
{
glDeleteVertexArrays(1, &m_vertexArrayObject);
}

您有一个隐式复制构造函数,每当您的 Mesh 的拷贝被复制时,它都会逐字节复制您的类的成员。是必要的。该逐字节拷贝包括 OpenGL 管理资源的名称 ( m_vertexArrayObject ),这意味着您现在有两个不同的对象引用相同的资源。

一旦其中一个拷贝超出范围,它就会删除仍被原始对象引用的 VAO。

解决这个问题最简单的方法是禁用复制构造函数(C++11 对此有新的语法),然后你会在任何需要复制的时候得到一个编译器错误。

private:
Mesh (const Mesh& original); // Copy ctor is inaccessible.

如果你真的想支持多个Mesh共享相同顶点数组对象的对象,您将需要添加引用计数并且仅在引用计数达到0时释放 VAO。

关于c++ - OpenGL:vertexArray 与 glBegin(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com