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

0

(編集済み)

ここにパラメーターNULLとして渡されることに問題があると思いました:indicesglDrawElements()

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

最後のパラメーター はindices、以前は必須であり、渡す0NULL機能しませんでした。これは、そのアドレスからインデックスを読み取ろうとし、アクセス違反読み取り位置 0x00000000 というエラーが発生するためです。

しかし、Jhericoが指摘したように、インデックスがバインドされたバッファーを持つことが可能でありGL_ELEMENT_ARRAYindicesパラメーターはポインターではなく、そのバッファーへのオフセットです。0 を渡すと、単純に「オフセットなし」を意味します。そして、Oculus Rift SDK はこの方法を使用しているようです。

したがって、行のアドレス 0x0 への無効なアクセスでクラッシュするプログラムは、使用すべきでないことglDrawElements()を示すのではなく、バッファが正しく初期化または有効化されていないことを示しています。Jhericoがより良い答えで指摘したように、おそらく不適切なクリーンアップが原因です。0GL_ELEMENT_ARRAY

于 2014-04-17T10:46:32.450 に答える