Необработанное исключение (nvoglv32.dll) во время рисования (разлом)

На самом деле я работаю над созданием AR с помощью HMD Oculus Rift.
Я не профессионал в openGL, и я уверен, что это источник моей проблемы.

Я получаю эту ошибку:

Необработанное исключение в 0x064DBD07 (nvoglv32.dll) в THING.exe: 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();
}

Если я вызову renderCamera до GlUtils :: drawColorCube (true); это сбой, но после того, как это работает.
Но мне нужно нарисовать камеру перед остальными.
Я не собираюсь точно рисовать drawColorCube, потому что он использует другой шейдер.
Я полагаю, что проблема в том, что в шейдерной программе чего-то не хватает. Итак, вот фрагмент и вершинный шейдер.

Vertex:

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

(Я хочу нарисовать сцену на изображении с камеры).
Любая идея?

0

Решение

(Edited)

Я думал, что проблема была в NULL передается как indices параметр для glDrawElements() Вот:

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

Последний параметр, indicesраньше был обязательным и проходил 0 или же NULL не будет работать, потому что он будет пытаться прочитать индексы с этого адреса и выдаст эту ошибку Место чтения нарушения доступа 0x00000000.

Но, как Jherico указал, что возможно иметь буфер с индексами, привязанными к GL_ELEMENT_ARRAY а затем indices Параметр — это смещение в этом буфере, а не указатель. Передача 0 тогда просто означает «без смещения». И Oculus Rift SDK, видимо, использует этот метод.

Сбой программы с неверным доступом к адресу 0x0 в строке с glDrawElements() поэтому не означает, что 0 не должен использоваться, но что GL_ELEMENT_ARRAY буфер не инициализирован или включен правильно. Вероятно, из-за неправильной очистки, как Jherico указал в своем лучшем ответе.

0

Другие решения

Вы не очищаете состояние GL после звонка quadGeometry_supcam->draw();, Попробуйте добавить эти строки после этого вызова

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

По вопросам рекламы [email protected]