gpt4 book ai didi

c# - OpenTK 显卡在遮挡剔除期间崩溃

转载 作者:行者123 更新时间:2023-12-02 08:09:37 32 4
gpt4 key购买 nike

我最近在我的游戏中实现了视锥体剔除,并且为了从渲染周期中挤出最后一滴,我还决定实现遮挡剔除。它工作得很好,但是,我很痛苦地发现,如果我不看游戏中的任何东西(如果我向虚空看,远离我的游戏对象),我的显卡就会崩溃。我正在运行一个体素类型的游戏,这意味着它是一个充满立方体的世界。如果我的视线中没有立方体,就会发生崩溃。

这是我的渲染循环,其中包含遮挡代码:

protected override void OnRenderFrame( FrameEventArgs e ) {
base.OnRenderFrame( e );

GL.MatrixMode( MatrixMode.Modelview );
GL.Clear( ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit );
GL.EnableClientState( ArrayCap.VertexArray );
GL.EnableClientState( ArrayCap.TextureCoordArray );
GL.DisableClientState( ArrayCap.ColorArray );

/**
* Pass 1
* Do Occlusion Testing
*/
GameCamera.LookThrough( this , _mousePosition , e );
foreach( Voxel voxel in World.VisibleVoxels ) {
if( GameCamera.Frustum.SphereInFrustum( voxel.Location.X , voxel.Location.Y , voxel.Location.Z , 2.0f ) ) {
try {
GL.BeginQuery( QueryTarget.SamplesPassed , voxel.OcclusionID );
voxel.Render( GameCamera );
GL.EndQuery( QueryTarget.SamplesPassed );
} catch( Exception ex ) {
//
Console.WriteLine( "Setting It" );
Console.WriteLine( ex.StackTrace );
}
}
}
GL.Clear( ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit );
/**
* Pass 2
* Normal Rendering
*/
GameCamera.LookThrough( this , _mousePosition , e );
foreach( Voxel voxel in World.VisibleVoxels ) {
if( GameCamera.Frustum.SphereInFrustum( voxel.Location.X , voxel.Location.Y , voxel.Location.Z , 2.0f ) ) {
try {
GL.NV.BeginConditionalRender( voxel.OcclusionID , NvConditionalRender.QueryWaitNv );
voxel.Render( GameCamera );
GL.NV.EndConditionalRender();
} catch( Exception ex ) {
Console.WriteLine( "Testing It" );
Console.WriteLine( ex.StackTrace );
}

}
}
GL.DisableClientState( ArrayCap.VertexArray );
GL.DisableClientState( ArrayCap.TextureCoordArray );
GL.DisableClientState( ArrayCap.ColorArray );
RenderDeveloperHud();
SwapBuffers();
this.Title = GAME_NAME + " FPS: " + ( int )this.RenderFrequency;
}

我迫切需要找到解决方案。在我看来,当我的视口(viewport)中没有任何可见内容时,OpenTK/OpenGL 会翻转它的狗屎,但我不知道为什么。如果没有任何可见的东西,循环本身应该通过。我在这里遗漏了什么吗?

每次我启动游戏并将视线从关卡上移开时,我都能准确地重现此崩溃。我所说的崩溃是指我的整个显示器变黑,挂起,然后恢复并显示一条消息说我的显示驱动程序停止工作

最佳答案

应用程序可能会通过传递无效状态或数据(有时甚至传递有效状态或数据)来导致 GPU 崩溃。

尝试使用apitrace跟踪向驱动程序发出的 OpenGL 命令并捕获导致崩溃的命令。

使用 OpenTK.dll 的调试版本运行应用程序也将帮助您捕获错误:OpenTK 将在每个 GL 命令后使用 GL.GetError() 并引发如果出现问题则异常(exception)。要构建 OpenTK 的调试版本,download the source code并构建OpenTK.sln

关于c# - OpenTK 显卡在遮挡剔除期间崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25842668/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com