- 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/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在使用 Cocoa + OpenGL 为 MacOS 构建一个小游戏来创建 GUI。该游戏是 BoulderDash-Clone,因此它基本上是一个 2D 对象数组,而且数量不多(一个关卡大约有
我以后还能用这些方法吗?另外,如果没有,有人可以推荐一些关于 lwjgl 中现代 OpenGL 的好教程吗?谢谢 最佳答案 在LWJGL中,“已弃用”只是意味着它已经过时了,我真的怀疑glBegin是
如标题所示,我希望每帧/更新只能调用一次 glBegin 和 glEnd ,因为我听说并且正在经历,如果每次更新多次调用它,速度会大大减慢。 这是我的渲染函数的代码: GL11.glTranslate
我正在创建一个程序,允许我在 3 个空间中绘制点,使用 Catmull-Rom 样条连接它们,然后围绕样条绘制一个圆柱体。我正在使用 GL_TRIANGLES_STRIP 以短间隔连接样条曲线周围绘制
我想制作一个 OpenGL 游戏,但现在意识到我在学校学到的东西 -> 直接通过 glBegin/glEnd 绘制对象 -> 是老式的和糟糕的。在互联网上阅读我发现顶点缓冲区对象和 GLSL 是 3d
我正在学习一些关于 OpenGL 的教程,但遇到了一个问题。我构建了一个名为 Mesh 的类,它在其构造函数中采用顶点数组并生成顶点数组等来进行绘图。问题是我什么也没看到。这是界面: class Me
我尝试设计一个场景,其中有 3 个球体和一条水平线作为赤道。我必须画出 3 个球体,但我不知道为什么线没有画出来。 这是我的代码,如果你能看出我哪里错了: #include #include vo
我正在计算很多顶点,然后用四边形 strip 显示它们以获得 3D 曲面图。 我对某些顶点有一种奇怪的行为,以不可预测的方式改变颜色。我尝试修复它,巧合的是,当我在前后放置 glPushMatrix(
我正在尝试并排绘制 2 个不同颜色的方 block ,我的问题是我无法让 glTranslatef 将我的第二个方 block 向右移动,第二个方 block 只是在第一个方 block 上绘制。 v
绘制大量点时,有没有办法改变点的大小?我知道有 glPointSize(float),但是有没有办法在“批处理”或数组中做到这一点? 我希望点具有基于数据属性的不同大小。例如每个点都有 x、y、z 和
我正在尝试学习为 iPhone 编写 OpenGL 应用程序。如何移植以下代码以与 OpenGL-ES 一起使用?我知道我必须将顶点存储在数组中,然后调用 glDrawArrays(),但是有没有最佳
经过多年关于“顶点缓冲对象”(VBO)的了解,我终于决定尝试使用它们(我的东西通常对性能没有要求,显然...) 我将在下面描述我的实验,但总而言之,我发现“简单”直接模式(glBegin()/ glE
glBegin(GL_TRIANGLE_STRIP); for(i; i <= degree; i++) { float
此代码仅呈现十二面体并完全忽略 glBegin(GL_TRIANGLES) block : glutSolidDodecahedron(); glBegin(GL_TRIANGLES); glNorm
我一直在我的函数中使用 glDrawArrays。 由于某些原因,我在使用 glDrawArrays 绘图时掉了大约 400fps。 为了测试,我调用了 Print 函数 2000 次。 不太确定为什
将调用 glBegin 和 glEnd 的代码括在方括号中的目的是什么?它是否具有程序或功能目的,或者仅仅是为了美学和风格?下面的代码是用 C 写的。 glBegin(GL_POLYGON); glC
我有这个程序,您可以在下面看到。程序应该将某些内容渲染到纹理,并且渲染的纹理应该被绘制以显示。但是当调用 glBegin(GL_QUADS) 时,程序在 display() 函数处失败。程序结束打印
我在 StackOverflow 上的某个地方找到了这种跨平台的绘制文本的方法: def drawText(x, y, text):
我是 OpenGL 编程的新手,一切都很好,直到我突然收到段错误,现在无法摆脱它。任何人都可以发现段错误并向我解释吗? 注意:虽然这是一项作业,但我不是来这里寻找答案的。事实上,我什至不会提及分配细节
我是一名优秀的程序员,十分优秀!