我实际上正致力于用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);
}
(我想在相机的图像上绘制场景)。 有什么想法吗?
答案 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
曾经是强制性的,传入0
或NULL
不会起作用,因为它会尝试从该地址读取索引并将产生该错误访问冲突读取位置0x00000000。
但正如 Jherico 指出的那样,可能有一个索引绑定到GL_ELEMENT_ARRAY
的缓冲区,然后indices
参数是该缓冲区的偏移量,而不是指针。传递0然后简单地意味着没有偏移'。 Oculus Rift SDK显然使用了这种方法。
由于glDrawElements()
行对地址0x0的无效访问导致程序崩溃,因此不表示不应使用0
,而是GL_ELEMENT_ARRAY
缓冲区未初始化或正确启用。可能是因为不正确的清理,正如 Jherico 在他更好的答案中指出的那样。