0

我实际上正在使用 HMD oculus rift 制作 AR。我不是openGL的专家,我确​​信这是我问题的根源。

我收到此错误:

THING.exe 中 0x064DBD07 (nvoglv32.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

它在 quadGeometry_supcam->draw() 绘图期间发生;在 renderCamera(eye) 中;:

  glDrawElements(elementType, elements * verticesPerElement,
    GL_UNSIGNED_INT, (void*) 0);// Stop at this line in the debuger

这是绘图代码

  frameBuffer.activate();
  glEnable(GL_DEPTH_TEST);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  gl::Stacks::with_push(pr, mv, [&]{
    mv.preMultiply(eyeArgs.modelviewOffset);
    pr.preMultiply(eyeArgs.projectionOffset);
      //renderCamera(eye); //If I uncomment this part, it crash
    renderScene(eye);
      //renderCamera(eye); //If I uncomment this part, it works but It's not what I want
  });
  frameBuffer.deactivate();
  glDisable(GL_DEPTH_TEST);

  viewport(eye);
  distortProgram->use();
  glActiveTexture(GL_TEXTURE1);
  eyeArgs.distortionTexture->bind();
  glActiveTexture(GL_TEXTURE0);
  frameBuffer.color->bind();
  quadGeometry->bindVertexArray();
  quadGeometry->draw();
  gl::VertexArray::unbind();
  gl::Program::clear();

///////////////////////////////////////// ////////////

void renderScene(StereoEye eye) {
  GlUtils::renderSkybox(Resource::IMAGES_SKY_CITY_XNEG_PNG);
  GlUtils::renderFloorGrid(player);
  gl::MatrixStack & mv = gl::Stacks::modelview();
  gl::Stacks::with_push(mv, [&]{
  mv.translate(glm::vec3(0, eyeHeight, 0)).scale(ipd);
  GlUtils::drawColorCube(true); // Before this call renderCamera crash after it works
});
}

void renderCamera(StereoEye eye) {
  gl::ProgramPtr program;
  program = GlUtils::getProgram(
      Resource::SHADERS_TEXTURED_VS,
      Resource::SHADERS_TEXTURED_FS);
  program->use();
  textures[eye]->bind();
  quadGeometry_supcam->bindVertexArray();
  quadGeometry_supcam->draw();
 }

如果我在 GlUtils::drawColorCube(true); 之前调用 renderCamera 它崩溃但在它工作之后。但我需要先画相机。我不会精确 drawColorCube 因为它使用其他着色器。我想问题来自着色器程序缺少的东西。所以这里是片段和顶点着色器。

顶点:

uniform mat4 Projection = mat4(1);
uniform mat4 ModelView = mat4(1);

layout(location = 0) in vec4 Position;
layout(location = 1) in vec2 TexCoord0;

out vec2 vTexCoord;

void main() {
  gl_Position = Projection * ModelView * Position;
  vTexCoord = TexCoord0;
}

分段:

uniform sampler2D sampler;

in vec2 vTexCoord;
out vec4 vFragColor;

void main() {
  vFragColor = texture(sampler, vTexCoord);
}

(我想在相机的图像上绘制场景)。任何的想法?

4

2 回答 2

1

调用后,您并没有清理 GL 状态quadGeometry_supcam->draw();。尝试在通话后添加这些行

gl::VertexArray::unbind();
gl::Program::clear();
于 2014-05-05T23:56:37.853 回答
0

(已编辑)

我认为问题在于NULL作为indices参数传递到glDrawElements()这里:

 glDrawElements(elementType, elements * verticesPerElement,
                GL_UNSIGNED_INT, (void*) 0);

最后一个参数 ,indices曾经是强制性的并且传入0NULL不起作用,因为它会尝试从该地址读取索引并会产生错误访问冲突读取位置 0x00000000。

但正如Jherico指出的那样,可以有一个带有索引的缓冲区绑定到GL_ELEMENT_ARRAY,然后indices参数是该缓冲区的偏移量,而不是指针。然后传递 0 仅表示“无偏移”。而 Oculus Rift SDK 显然使用了这种方法。

程序因在行中对地址 0x0 的无效访问而崩溃,glDrawElements()因此并不表示0不应使用该程序,而是表示GL_ELEMENT_ARRAY缓冲区未正确初始化或启用。正如Jherico在他更好的答案中指出的那样,可能是因为清理不当。

于 2014-04-17T10:46:32.450 回答