- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将模型加载到我的项目中,但在 glDrawElements
处出现异常。我读取模型文件 (.nfg),并将顶点和索引保留到 vector 中,然后使用顶点缓冲区对象来绑定(bind)我的模型。
我试过了 this :我修改了 (GLvoid*)(sizeof(Vector3) * x)
的第四个参数到 (GLvoid*)(offset(Vertex, attribute))
,但什么也没做(在链接中,问题是他在第 4 个参数中发送内存地址,我想也许我向错误的属性发送了错误的参数,这在实际显示模型时仍然是个问题)。
我使用的是 OpenGL ES 2.0,我没有为 Android 或 iOS 做这个项目;目前在 Windows 8.1 上使用 Visual Studio 2013
模型加载器:
void loadModelNfg(const std::string &filename,
GLuint &vbo, GLuint &ibo, GLuint &num, Shaders shaders){
// put here the verteces and indices from the file
std::vector<Vertex> vertices;
std::vector<GLushort> indices;
_loadModelNfg(filename, vertices, indices);
std::cout << "Mesh Loader: loaded file: " << filename << "\n";
// creates OpenGL objects necessary for drawing
GLuint gl_vertex_buffer_object, gl_index_buffer_object;
// vertex buffer object -> object in which to keep the vertices
glGenBuffers(1, &gl_vertex_buffer_object);
glBindBuffer(GL_ARRAY_BUFFER, gl_vertex_buffer_object);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex),
&vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// index buffer object -> object in which to keep the indices
glGenBuffers(1, &gl_index_buffer_object);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl_index_buffer_object);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort),
&indices[0], GL_STATIC_DRAW);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
vbo = gl_vertex_buffer_object;
ibo = gl_index_buffer_object;
num = indices.size();
}
调用上一个函数:
// for now, global variables:
GLuint vbo, ibo, num;
Shader myShaders;
int Init ( ESContext* esContext ) {
glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
// this one works: tried with a triangle
int ret = myShaders.Init("../Resources/Shaders/TriangleShaderVS.vs",
"../Resources/Shaders/TriangleShaderFS.fs");
if (ret == 0)
loadModelNfg("../../ResourcesPacket/Models/Bila.nfg", vbo, ibo, num, myShaders);
return ret;
}
绘制模型:
void Draw(ESContext* esContext) {
Matrix world;
world.SetIdentity();
Matrix view = c.getView();
Matrix persp = c.getPerspective();
Matrix trans = world * view *persp;
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(myShaders.program);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
if (myShaders.positionAttribute != -1) {
glEnableVertexAttribArray(myShaders.positionAttribute);
glVertexAttribPointer(myShaders.positionAttribute, 3, GL_FLOAT,
GL_FALSE, sizeof(Vertex), (GLvoid*)(offsetof(Vertex, pos)));
}
if (myShaders.normalAttribute != -1) {
glEnableVertexAttribArray(myShaders.normalAttribute);
glVertexAttribPointer(myShaders.normalAttribute, 3, GL_FLOAT,
GL_FALSE, sizeof(Vertex), (GLvoid*)(offsetof(Vertex, norm)));
}
if (myShaders.binormalAttribute != -1) {
glEnableVertexAttribArray(myShaders.binormalAttribute);
glVertexAttribPointer(myShaders.binormalAttribute, 3, GL_FLOAT,
GL_FALSE, sizeof(Vertex), (GLvoid*)(offsetof(Vertex, binorm)));
}
if (myShaders.tangentAttribute != -1) {
glEnableVertexAttribArray(myShaders.tangentAttribute);
glVertexAttribPointer(myShaders.tangentAttribute, 3, GL_FLOAT,
GL_FALSE, sizeof(Vertex), (GLvoid*)(offsetof(Vertex, tgt)));
}
if (myShaders.texcoordAttribute != -1) {
glEnableVertexAttribArray(myShaders.texcoordAttribute);
glVertexAttribPointer(myShaders.texcoordAttribute, 2, GL_FLOAT,
GL_FALSE, sizeof(Vertex), (GLvoid*)(offsetof(Vertex, uv)));
}
if (myShaders.colorAttribute != -1) {
glEnableVertexAttribArray(myShaders.colorAttribute);
glVertexAttribPointer(myShaders.colorAttribute, 3, GL_FLOAT,
GL_FALSE, sizeof(Vertex), (GLvoid*)(offsetof(Vertex, col)));
}
if (myShaders.MVPuniform != -1) {
glUniformMatrix4fv(myShaders.MVPuniform, 1, GL_FALSE, (GLfloat*) trans.m);
}
// HERE GETS EXCEPTION
glDrawElements(GL_TRIANGLES, num, GL_UNSIGNED_SHORT, (GLvoid*) 0);
eglSwapBuffers (esContext->eglDisplay, esContext->eglSurface);
}
我不确定我是否正确绑定(bind)了 loadModelNfg() 函数中的缓冲区。
这个问题从何而来,如何解决?
编辑:
GL_VENDOR: Imagination Technologies (Host GL: 'Intel');
GL_RENDERER: PowerVR PVRVFrame 4.2SGX 530 (Host 'Intel(R) HD Graphics 400');
GL_VERSION: OpenGL ES 2.0 (SDK build: 2.04.24.0809)
编辑:
我用 try-catch 语句包围了这个函数,但在调用它时它仍然中断:
try {
glDrawElements(GL_TRIANGLES, num, GL_UNSIGNED_SHORT, (GLvoid*)0);
}
catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
我忘了提到项目/解决方案构建成功(清理后或通过重建)。
最佳答案
在了解到 OpenGL 不会抛出异常后,我开始研究它是如何处理错误的。我发现它“返回”错误代码(如果成功则返回 0),可以通过 glGetError()
找到。
通过glGetError()
查看代码,发现错误是由glUseProgram(myShaders.program);
引起的。
知道这一点后,我查看了使用 myShaders
变量的函数,我发现在调用 loadModelNfg("../../ResourcesPacket/Models/Bila.nfg", vbo, ibo, num, myShaders);
, 变量变了。
记得我不用它了,我就把它去掉了,一切都很好。
奇怪的是,我没有在该函数的任何地方修改 myShaders
变量(问题中的代码是最后一个)。我认为,问题在于我没有声明参数 const Shaders shaders
。
所以,结论:使用 glGetError()
和代码中的断点来查找真正的问题。它可能不是它断裂的地方!
PS:我希望我把这个作为答案是可以的。如果不是,我会更新问题。
关于c++ - glDrawElements 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940388/
我上周开始使用 OpenGL 3.3+,在尝试让索引绘图工作时遇到了这个问题。现在,我只是尝试使用 IBO 绘制一个三角形。 索引缓冲区和indexHandle: int[] tIndices = {
我的问题是我可以在不使用着色器的情况下使用 glDrawElements 吗? 我像下面这样生成我的 vbo: glGenBuffers(1, &vertexId_); glBindB
我正在尝试 Vertex Arrays 的东西,但由于某种原因 glDrawElements 命令没有为我绘制任何东西。我可以使用 glBegin/glEnd 和 glDrawElements 进行绘
在 iPhone 3G(设备,而不是模拟器)上使用 OpenGLES 1.1,我可以享受正常的绘图乐趣。但在应用程序运行期间的某些时候,我会遇到巨大的内存峰值,经过大量使用仪器的挖掘后,我发现是 gl
我对 VBO、VAO 和指数还很陌生。我能够渲染单个立方体,现在我尝试渲染一大块立方体。我的目标是慢慢制作一个体素引擎。我的 block 类有问题。由于某种原因它不显示任何内容。任何人都可以快速浏览一
我需要帮助来了解它们之间的权衡。 在我看来,glDrawElements() 需要获取“实时”索引数据作为参数。 另一方面,如果我使用 VAO,那么在启动期间我会缓冲数据,驱动程序可能会决定将其放在
如果我调用 glDrawElements 并将绘制目标作为后台缓冲区,然后调用 glReadPixels,是否可以保证我会读取绘制的内容? 换句话说,glDrawElements 是阻塞调用吗? 注意
我正在尝试将模型加载到我的项目中,但在 glDrawElements 处出现异常。我读取模型文件 (.nfg),并将顶点和索引保留到 vector 中,然后使用顶点缓冲区对象来绑定(bind)我的模型
我正在使用 c/c++ (NDK) for android 在 opengl es 2.0 中编程。我正在使用 GLM 库! 到目前为止,我可以使用 glDrawArrays 在黑色背景上绘制一个白色
我让 glDrawElements 始终如一地工作,最初使用一个简单的盒子,然后使用由大量顶点组成的更复杂的形状。然后它就停止绘制网格。我已经将代码恢复到最基本的状态,只需绘制 2 个三角形来制作一个
我使用以下代码创建缓冲区: //generate buffers glGenVertexArrays(1, &VAO); //glGenBuffers(1, &EBO); glGenBuffers(1
首先,我使用 OpenGL 渲染点云。 // The object pointCloud wraps some raw data in different buffers. // At this po
有两个 OpenGL 文档页面对 glDrawElements 函数的“索引”参数的描述略有不同。在 www.opengl.org/sdk/docs/man4/上它说: indices Spe
我正在使用 glDrawElements 绘制索引网格: voi d init() { //allocate vbo, copy actual data (m_indices,m_vertic
我读到 glDrawElements 的第一个参数是模式: http://www.opengl.org/sdk/docs/man3/xhtml/glDrawElements.xml Symbolic
我不明白这是怎么回事!我有这个网格加载器,当我用它加载小网格时,我的程序工作正常,绘制了整个网格。但是现在我用一个大网格(超过 100,000 个顶点)测试了程序,它只绘制了它的一小部分!是不是我的显
我正在尝试将一些顶点渲染到 Open GL ES 窗口。我的程序在执行 GLDrawElements 命令时不断崩溃。我正在尝试为 GLFloat 类型的顶点“bindPosition”、“bindN
给定一组面,每个面包含顶点数和指向 vector std::Vector 中的顶点的指针,我想遍历所有面并使用 glDrawElements 绘制每个面: 编辑:我刚刚注意到我忘了激活 vertex_
在我的 OpenGL 程序中,我有两个着色器。一个渲染纹理,另一个渲染纯色。编译和链接着色器后,我根据天气启用纹理坐标顶点属性数组,着色器是否包含该属性。 //This code is called
我对此感到很沮丧。我正在尝试使用 Vertex Buffer Objects 渲染立方体并且我正在学习 Projection 所以我正在尝试制作立方体的框架。但是,此代码不起作用。当我在 Code::
我是一名优秀的程序员,十分优秀!