C++ OpenGL:vertexArray vs glBegin()
我正在学习OpenGL教程,遇到了一个问题。我构造了一个名为C++ OpenGL:vertexArray vs glBegin(),c++,opengl,C++,Opengl,我正在学习OpenGL教程,遇到了一个问题。我构造了一个名为Mesh的类,该类在其构造函数中获取一个顶点数组,并生成VertexArray等来绘制。问题是我什么都没看到。以下是界面: class Mesh { public: Mesh(Vertex * vertices, size_t numVertices); virtual ~Mesh(); void Draw(); private: enum { POSITION_VB, NUM_BUF
Mesh
的类,该类在其构造函数中获取一个顶点数组,并生成VertexArray等来绘制。问题是我什么都没看到。以下是界面:
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()
{
glDeleteVertexArrays(1, &m_vertexArrayObject);
}
您有一个隐式复制构造函数,每当需要Mesh
的副本时,它会对类的成员进行逐字节复制。该逐字节副本包括OpenGL托管资源的名称(m_vertexArrayObject
),这意味着您现在有两个不同的对象引用同一资源
一旦其中一个副本超出范围,它将删除仍由原始对象引用的VAO
解决此问题的最简单方法是禁用复制构造函数(C++11为此提供了新语法),然后在任何需要复制的时候都会出现编译器错误
private:
Mesh (const Mesh& original); // Copy ctor is inaccessible.
如果确实希望支持共享同一顶点数组对象的多个网格
对象,则需要添加引用计数,并且仅当引用计数达到0时才释放VAO,这很可能是网格类析构函数造成的:
Mesh::~Mesh()
{
glDeleteVertexArrays(1, &m_vertexArrayObject);
}
您有一个隐式复制构造函数,每当需要Mesh
的副本时,它会对类的成员进行逐字节复制。该逐字节副本包括OpenGL托管资源的名称(m_vertexArrayObject
),这意味着您现在有两个不同的对象引用同一资源
一旦其中一个副本超出范围,它将删除仍由原始对象引用的VAO
解决此问题的最简单方法是禁用复制构造函数(C++11为此提供了新语法),然后在任何需要复制的时候都会出现编译器错误
private:
Mesh (const Mesh& original); // Copy ctor is inaccessible.
如果您确实希望支持多个网格
对象共享同一顶点数组对象,则需要添加引用计数,并且仅当引用计数达到0时才释放VAO。着色器如何?我在别处设置了着色器,我非常确定它们的功能是正确的,因为它们还确定了所使用的glBegin零件的颜色drawable@Slugger:无法编写一个可以同时使用glVertex*
命令和glvertexattributepointer
命令的着色器。至少,不依赖NVIDIA的非标准行为是不行的。所以我想看看你的着色器。我刚刚添加了着色器代码。很抱歉,我今天一整天都在大学。着色器呢?我在别处安装了着色器,我非常确定它们的功能是正确的,因为它们还确定了所使用的glBegin零件的颜色drawable@Slugger:无法编写一个可以同时使用glVertex*
命令和glvertexattributepointer
命令的着色器。至少,不依赖NVIDIA的非标准行为是不行的。所以我想看看你的着色器。我刚刚添加了着色器代码。很抱歉回复晚了,我今天一整天都在大学