绘图期间未处理的异常(nvoglv32.dll)(裂口)

时间:2014-04-17 10:13:57

标签: c++ opengl textures glsl oculus

我实际上正致力于用HMD眼裂缝制作AR。 我不是openGL的专家,我确​​信这是我问题的根源。

我收到此错误:

  

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

在quadGeometry_supcam-> draw();那是在renderCamera(眼睛); :

  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);
}

(我想在相机的图像上绘制场景)。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

致电quadGeometry_supcam->draw();后,您无法清理GL状态。尝试在调用后添加这些行

gl::VertexArray::unbind();
gl::Program::clear();

答案 1 :(得分: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显然使用了这种方法。

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