gpt4 book ai didi

c++ - C/C++ OpenGL 遮挡剔除

转载 作者:行者123 更新时间:2023-11-30 04:16:45 24 4
gpt4 key购买 nike

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

我遇到的最后一个问题是剔除。我终于想出了如何制作 Frustum Culling 和 Backface Culling,它们都运行良好,但不幸的是我不知道如何编写遮挡剔除代码以不显示被更靠近玩家的其他框覆盖的框。

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

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

和立方体::绘制:

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

我很确定它的效率很低,正如我之前所说的,这段代码很快就会被优化。现在我正在努力让它发挥作用。 bool 变量 showSide 用于检测,如果旁边有其他盒子,则不会绘制它们之间的边。

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

我的问题是,任何人都可以帮助我如何不绘制覆盖 block ?我听说我已经编译并注入(inject)了 GLEW,它有以下两行: glBeginQuery(GL_SAMPLES_PASSED_ARB,查询); glEndQuery(GL_SAMPLES_PASSED);

显然 Query 有助于解决我的问题,但我尝试通过 Google 以多种方式使用它但没有成功,首先没有绘制立方体,其次游戏像之前那样绘制,也覆盖了立方体。

最佳答案

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

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

这是关于某人从头开始开发类似 minecraft 的引擎,并涵盖从遮挡到照明再到透明度的所有内容。事实上,第一部分应该可以很好地回答您的问题。

关于c++ - C/C++ OpenGL 遮挡剔除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17569458/

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