- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对此感到很沮丧。我正在尝试使用 Vertex Buffer Objects 渲染立方体并且我正在学习 Projection 所以我正在尝试制作立方体的框架。但是,此代码不起作用。当我在 Code::Blocks 上运行程序时,程序停止工作。
我试图通过注释掉 render() 方法的内容来找出原因,然后程序并没有停止工作。所以这行代码
glDrawElements(GL_TRIANGLES, m_index->size(), GL_UNSIGNED_INT, 0); // render the cube
可能是问题的根源。但我不知道如何解决这个问题,因为这正是我通常做的(我制作了类似的程序并且它们有效)
非常感谢您的帮助!
ProjectionCube::ProjectionCube()
{
rotationAngle = 0.0;
}
bool ProjectionCube::initialize()
{
#ifdef _WIN32
glGenBuffers = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffers");
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
#else
glGenBuffers = (PFNGLGENBUFFERSARBPROC)glXGetProcAddress((const GLubyte*)"glGenBuffers");
glBindBuffer = (PFNGLBINDBUFFERPROC)glXGetProcAddress((const GLubyte*)"glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC)glXGetProcAddress((const GLubyte*)"glBufferData");
#endif
if (!glGenBuffers || !glBindBuffer || !glBufferData)
{
std::cerr << "VBOs are not supported by your graphics card" << std::endl;
return false;
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
initializeVertexBuffers();
// bind vertex buffer and index buffer
// set vertex pointer to the buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbos[INDEX_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, m_vbos[VERTEX_BUFFER]);
glVertexPointer(3, GL_FLOAT, 0, 0);
// no color buffer to bind
return true;
}
void ProjectionCube::initializeVertexBuffers()
{
const float size = 0.5f;
m_vertex = getCubeVertices(size);
for (int i = 0; i < m_vertex->size(); i++) {
std::cout << m_vertex->at(i) << ", ";
}
std::cout << std::endl;
static const unsigned int index[] = {//using triangles to render
0, 1, 2, 0, 2, 3, //bottom
0, 4, 5, 0, 1, 5, //back
0, 4, 7, 0, 3, 7, //left
1, 5, 6, 1, 2, 6, //right
4, 5, 6, 4, 7, 6, //top
2, 6, 7, 2, 3, 7}; // front
m_index = new vector<unsigned int>(index, index + sizeof(index) / sizeof(index[0]));
for (int i = 0; i < m_index->size(); i++) {
std::cout << m_index->at(i) << ", ";
}
std::cout << std::endl;
glGenBuffers(1, &m_vbos[VERTEX_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, m_vbos[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * m_vertex->size(),
&m_vertex->at(0), GL_STATIC_DRAW);
glGenBuffers(1, &m_vbos[INDEX_BUFFER]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbos[INDEX_BUFFER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * m_index->size(),
&m_index->at(0), GL_STATIC_DRAW);
}
void ProjectionCube::render(float m_x, float m_y, float m_z)
{
glTranslatef(m_x, m_y, m_z); // move to where the cube is located
//glRotatef(rotationAngle, 0.5f, 0.0f, 0.0f);
glDrawElements(GL_TRIANGLES, m_index->size(), GL_UNSIGNED_INT, 0); // render the cube
}
void ProjectionCube::animate(float dt)
{
const float SPEED = 15.0f;
rotationAngle += SPEED * dt;
if (rotationAngle >= 360 || rotationAngle <= 0) {
rotationAngle = -rotationAngle;
}
}
vector<GLfloat>* ProjectionCube::getCubeVertices(float r)
{
static const GLfloat vertices[] = {//bottom square
-r, -r, -r,
r, -r, -r,
r, -r, r,
-r, -r, r,
//top square
-r, r, -r,
r, r, -r,
r, r, r,
-r, r, r,};
vector<GLfloat>* result = new vector<GLfloat>(vertices, vertices + sizeof(vertices) / sizeof(vertices[0]));
return result;
}
最佳答案
由于调用 render
时您没有发布,我所能做的就是建议您不要使用 new vector
。据我所知,没有必要。
由于在 render
函数中使用 m_index
时发生错误,并且假设 m_index
是指向 vector 的指针,则有不需要它是一个指针(假设它是 ProjectionCube
的成员变量)。
new vector
有两个问题。为什么你的程序会在getCubeVertices
函数中动态分配一个?以下删除动态分配:
vector<GLfloat> ProjectionCube::getCubeVertices(float r)
{
static const GLfloat vertices[] = {//bottom square
-r, -r, -r,
r, -r, -r,
r, -r, r,
-r, -r, r,
//top square
-r, r, -r,
r, r, -r,
r, r, r,
-r, r, r,};
return vector<GLfloat>(vertices, vertices + sizeof(vertices) / sizeof(vertices[0]));
}
然后在InitializeVertexBuffers()
中,m_vertex
成员变量不再是指针,而是一个对象:
std::vector<GLfloat> m_vertex; // assuming these are member variables in your class
std::vector<unsigned int> m_index;
//...
void ProjectionCube::initializeVertexBuffers()
{
const float size = 0.5f;
m_vertex = getCubeVertices(size);
//...
m_index = vector<unsigned int>(index, index + sizeof(index) / sizeof(index[0]));
同样,不需要new vector
。您现在使用 m_index.
和 m_vertex.
。
与您之前所做的相比,现在这给您带来了什么?好了,现在您可以保证 m_index
在调用 render
时有效。 m_index
没有办法被释放,或者指针损坏等,因为 m_index
不再是指针。
您还可以使用上述方法消除潜在的内存泄漏。
关于c++ - glDrawElements,为什么会导致程序停止工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967955/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!