繁体   English   中英

C / C ++ OpenGL遮挡剔除

[英]C/C++ OpenGL Occlusion Culling

我正在尝试原始OpenGL,所以我决定编写基于3d块的非常非常简单的游戏,这是Minecraft游戏中的一种“智障”游戏,目的只是为了提高我的技能。

我遇到的最后一个问题是剔除。 我终于弄清楚了如何制作“平截头体剔除”和“背面剔除”,它们都工作良好,但是不幸的是,我不知道如何编写“遮挡剔除”的代码,以不显示被其他更靠近玩家的盒子所覆盖的盒子。

只是为了在主绘制循环中进行测试,我将遍历所有框,稍后将其更改为更有效的方式,现在代码如下所示:

for( std::map< std::string, Cube* >::iterator it = Cube::cubesMap.begin( ); it !=  Cube::cubesMap.end( ); it++ )
{
    cube = ( *it ).second;

    if( !cube )
        continue;

    (...)

    if( Camera::cubeInFrustum( cube->position.x, cube->position.y, cube->position.z, 0.5f ) && cube->isInRoundDistance( 80 ) )
        cube->draw( );
}

和Cube :: Draw:

void Cube::draw( )
{
    glPushMatrix( );
    glTranslatef( position.x, position.y, position.z );

    if( showSide1 == false && showSide2 == false && showSide3 == false && showSide4 == false && showSide5 == false && showSide6 == false )
    {
        glPopMatrix( );
        return;
    }

    GLfloat cube[] = 
    {
        -0.5f, -0.5f,  0.5f,// Front face
         0.5f, -0.5f,  0.5f,
        -0.5f,  0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
        -0.5f, -0.5f, -0.5f,// Back face
        -0.5f,  0.5f, -0.5f,
         0.5f, -0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
        -0.5f, -0.5f,  0.5f,// Left face
        -0.5f,  0.5f,  0.5f,
        -0.5f, -0.5f, -0.5f,
        -0.5f,  0.5f, -0.5f,
         0.5f, -0.5f, -0.5f,// Right face
         0.5f,  0.5f, -0.5f,
         0.5f, -0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
        -0.5f,  0.5f,  0.5f,// Top face
         0.5f,  0.5f,  0.5f,
        -0.5f,  0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
        -0.5f, -0.5f,  0.5f,// Bottom face
        -0.5f, -0.5f, -0.5f,
         0.5f, -0.5f,  0.5f,
         0.5f, -0.5f, -0.5f 
    };

    float textures[] =
    {
        1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 

        0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 

        0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 

        0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 

        0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 

        0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f
    };

    //ss << position.x + 2 << ", " << position.y << ", " << position.z << std::endl;

    glVertexPointer(3, GL_FLOAT, 0, cube);
    glTexCoordPointer(2, GL_FLOAT, 0, textures);

    if( showSide1 || showSide2 || showSide3 || showSide4 )
        glBindTexture(GL_TEXTURE_2D, imageSides->texture);

    if( showSide1 )
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    if( showSide2 )
        glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);

    if( showSide3 )
        glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);

    if( showSide4 )
        glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);

    if( showSide5 )
    {
        glBindTexture(GL_TEXTURE_2D, imageUp->texture);
        glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
    }

    if( showSide6 )
    {
        glBindTexture(GL_TEXTURE_2D, imageDown->texture);
        glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);
    }

    glPopMatrix( );
}

我可以肯定它的效率很低,正如我之前所说的,此代码将很快进行优化。 现在,我正在尝试使其正常运行。 布尔变量showSide用于检测,如果旁边有一个带有其他框的框,则不会绘制它们之间的边。

我一直在寻找和搜寻如何进行遮挡剔除,但是我失败了,只有简单的信息或理论。

我的问题是,有人可以帮助我如何不绘制遮盖的方块吗? 我听说有我编译和注入的GLEW,它有两行:glBeginQuery(GL_SAMPLES_PASSED_ARB,query); glEndQuery(GL_SAMPLES_PASSED);

显然Query可以帮助解决我的问题,但是我尝试通过多种方式与Google一起使用均未成功,首先没有绘制任何多维数据集,其次像以前绘制游戏一样,也覆盖了多维数据集。

通常,您不应该期望图形API为您完成工作-它的工作是呈现,而您的工作是确保尽可能少地呈现。

我建议阅读此博客: http : //www.sea-of-memes.com/summary/blog_parts.html

它是关于某人从零开始开发类似于Minecraft的引擎,并且涉及从遮挡,照明到透明度的所有内容。 实际上,第一部分应该很好地回答您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM