- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在学习一些关于 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/
我有一个使用顶点数组绘制的 spritesheet 动画。作为一个例子,假设我有一个指向右边的箭头和一个简单的动画。我希望能够在 x 轴上翻转纹理,以便箭头也可以指向左侧,而无需将我的 sprites
当我调用 glGenVertexArrays() 时出现段错误。我尝试设置 glewExperimental = GL_TRUE 但我仍然收到错误。这是我的小代码。 #include #includ
编写一个 OpenGL 程序在屏幕上绘制一个正方形,但遇到无效值错误。调用 MyGLCall(glVertexAttribPointer(i,) 时发生错误。MyGLCall 是 GLCALL 的抽象
我正在学习一些关于 OpenGL 的教程,但遇到了一个问题。我构建了一个名为 Mesh 的类,它在其构造函数中采用顶点数组并生成顶点数组等来进行绘图。问题是我什么也没看到。这是界面: class Me
如何从构造的 VertexArray 中绘制我选择的图元?在下面的示例中,我向“顶点”数组添加了两个顶点,并尝试使用“window.draw(vertices, 2, sf::Lines)”绘制它,但
经过一些研究后发现,使用 vertexArrays 似乎是一次将许多 Sprite 绘制到屏幕上的最有效方式,但我正在努力如何去做。我曾尝试使用 sfml 论坛,但我看到的每个示例都来自过时的代码,到
我有以下程序用于绘制带有顶点数组的三角形,如 SFML 教程中所述。 #include #include int main() { try{ sf::RenderWindo
我是一名优秀的程序员,十分优秀!