我最近在我的游戏中实现了Frustum剔除,并且为了挤压渲染周期中的所有最后一个落点,我还决定实施遮挡剔除。它的运行非常出色,但是,我很沮丧地发现,如果我不看游戏中的任何内容(,如果我望着空白并远离游戏对象),我的显卡就会崩溃。我正在运行体素型游戏,这意味着它是一个充满立方体的世界。如果我的视线中没有立方体,则会发生崩溃。

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

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

我迫切需要为此找到解决方案。在我看来,当我的视口中看不到任何东西时,OpenTK / OpenGL会翻转它的内容,但我不知道为什么。如果什么都不可见,则循环本身应该通过。我在这里想念什么吗?

,每次启动游戏并移离关卡时,我都可以从字面上重现此崩溃。而且由于崩溃,我的意思是我的整个显示器变黑,挂断,然后继续显示一条消息,说我的显示驱动程序停止工作

最佳答案

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

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

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

07-28 02:02
查看更多