Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 启用深度测试时,OpenGL不会丢弃我的片段_C++_Opengl_Wxwidgets - Fatal编程技术网

C++ 启用深度测试时,OpenGL不会丢弃我的片段

C++ 启用深度测试时,OpenGL不会丢弃我的片段,c++,opengl,wxwidgets,C++,Opengl,Wxwidgets,我正在用wxWidgets 3.1.3编写一个OpenGL渲染器。我可以看到隐藏在我的模型后面的碎片,但它们面向我,即使它们应该被遮住。将我的片段着色器设置为显示深度表明深度设置正确,并且znear=0.1和zfar=100 以下是我的OpenGL初始化代码: this->m_glcontext=newwxglcontext(this); this->SetCurrent(*this->m_glcontext); std::remove(ENGINECANVAS\u LOG\u路径); glew

我正在用wxWidgets 3.1.3编写一个OpenGL渲染器。我可以看到隐藏在我的模型后面的碎片,但它们面向我,即使它们应该被遮住。将我的片段着色器设置为显示深度表明深度设置正确,并且znear=0.1和zfar=100

以下是我的OpenGL初始化代码:

this->m_glcontext=newwxglcontext(this);
this->SetCurrent(*this->m_glcontext);
std::remove(ENGINECANVAS\u LOG\u路径);
glewExperimental=GL_TRUE;
glewInit();
glLoadIdentity();
glEnable(GL_CULL_面);
glEnable(GLU深度试验);
glDepthFunc(GL_LEQUAL);;
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
glEnable(GL_混合物);
glEnable(总帐调试输出);
glEnable(GL_调试_输出_同步);
glDebugMessageCallback(MessageCallback,0);
this->Bind(wxEVT_-PAINT,&EngineCanvas::PAINT,this);
此->渲染();
这是我的渲染循环:

glViewport(0,0,(闪烁)this->GetSize().x,(闪烁)this->GetSize().y);
glClearColor(1.0f、1.0f、1.0f、1.0f);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
此->m_活动摄像头->GenPerspMat((浮动)画布->GetSize().x,(浮动)画布->GetSize().y);
此->m_活动摄像头->GenViewMat();
对于(size_t i=0;imodels.size();i++)
{
这->models.at(i)->GenPosMat();
此->建模.at(i)->着色器程序->选择();//选择着色器程序
这个->m_活动摄像头->设置制服(这个->models.at(i)->着色器程序);
这->models.at(i)->SetUniforms();
glBindVertexArray(此->models.at(i)->vao);
对于(size_t j=0;jmodels.at(i)->vertex_buffers_count.size();j++)
{
glBindBuffer(GL_数组_BUFFER,this->models.at(i)->vertex_buffers.at(j));
gldrawArray(this->models.at(i)->triangle_mode,0,this->models.at(i)->vertex_buffers_count.at(j));
}
}
glFlush();
此->SwapBuffers();
片段着色器:

#版本400核心
布局(位置=0)输出向量4 frag_out;
在vec3 VPO中;
void main()
{
frag_out=vec4(vec3(gl_FragCoord.z).xyz,1.0f);
}
我的碎片在我的NVIDIA显卡上被很好地丢弃了,但是在两台不同的笔记本电脑和我的集成显卡上测试会产生这个错误。我的几何体本身渲染正确。回调不会返回任何错误(回调正在工作)。所有卡都至少支持OpenGL 4.0(在我的着色器和GLCanvas参数中指定)。

多亏了Rabbid76

我需要在wxGLCanvas的参数中指定深度缓冲区。我需要使用wxGLAttributes类并传递它,而不是在wiki示例中提供int数组

wxGLAttributes args;
args.PlatformDefaults().Depth(24).Stencil(8.RGBA().DoubleBuffer().EndList();

现在我知道该看哪里了,这在wxWidgets提供的金字塔示例中有记录。

可能默认帧缓冲区没有深度缓冲区(这取决于系统)。在设置OpenGL小部件时,是否明确强制创建深度缓冲区?看见另见@rabbi76非常感谢您的帮助。这对我来说已经解决了。我以在wiki页面上显示的传统方式(一个int数组)向GLCanvas提供参数,但这已经解决了这个问题。如果你关心rep,我很乐意接受一个空白的答案,但除此之外,我真诚地感谢你的帮助。