Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:vertexArray vs glBegin()_C++_Opengl - Fatal编程技术网

C++ OpenGL:vertexArray vs glBegin()

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

我正在学习OpenGL教程,遇到了一个问题。我构造了一个名为
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的非标准行为是不行的。所以我想看看你的着色器。我刚刚添加了着色器代码。很抱歉回复晚了,我今天一整天都在大学