gpt4 book ai didi

c++ - 为什么我的一些立方体面没有按照我希望的方式呈现?

转载 作者:太空狗 更新时间:2023-10-29 21:46:13 25 4
gpt4 key购买 nike

左侧的正面;右边右边的脸

Cube Front

左侧背面;左脸右脸

Cube Back

经过一些调试,我得出了几个结论:

  • 面部剔除(在照片中关闭)似乎使情况变得更糟。

  • 深度缓冲(在照片中打开)似乎帮助不大。

面部剔除使用 glFrontFace( GL_CW ) | glFrontFace( GL_CCW ) 结合 glCullFace( GL_BACK_FACE )

更新

这是 Need4Sleep 提供的代码片段的结果:

(注意:GL_LESS 深度比较本身似乎没有改变任何东西)

左脸;右脸在右 - 面部剔除已打开

withCulling


代码概览

顶点和颜色在结构体中按顶点、颜色排序,称为 simdColorVertex_t,其中结构体的颜色和顶点组件均由 4 个 float 组成,每个 float 都有自己的各自的数组:

typedef float simdVec4_t[ 4 ];

typedef struct simdColorVert4_s
{
simdVec4_t position;
simdVec4_t color;
}
simdColorVert4_t;

ColorCube 类

构造函数创建其各自的程序。然后指定顶点和索引数据,并绑定(bind)到它们各自的缓冲区:

(为简洁起见省略了着色器程序创建)

    const float S = 0.5f;

const simdColorVert4_t vertices[] =
{
/*! Positions */ /*! Colors */ /*! Indices */
{ { S, S, S, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }, //! 0

{ { -S, S, S, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, //! 1

{ { -S, -S, S, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, //! 2

{ { S, -S, S, 1.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } }, //! 3

{ { S, S, -S, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } }, //! 4

{ { -S, S, -S, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, //! 5

{ { -S, -S, -S, 1.0f }, { 1.0f, 0.0f, 1.0f, 1.0f } }, //! 6

{ { S, -S, -S, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } } //! 7
};


const GLubyte indices[] =
{
1, 0, 2, 2, 0, 3, //! Front Face

3, 6, 4, 4, 0, 3, //! Right Face

3, 6, 2, 2, 6, 7, //! Bottom Face

7, 6, 4, 4, 5, 7, //! Back Face

7, 5, 2, 2, 1, 5, //! Left Face

5, 1, 4, 4, 0, 1, //! Top Face
};

//! The prefix BI_* denotes an enum, standing for "Buffer Index"

{
glBindBuffer( GL_ARRAY_BUFFER, mBuffers[ BI_ARRAY_BUFFER ] );
glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_DYNAMIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, 0 );

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mBuffers[ BI_ELEMENT_BUFFER ] );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( indices ), indices, GL_DYNAMIC_DRAW );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
}

从那里(仍然在构造函数中),创建并绑定(bind)顶点数组,以及它各自的属性和缓冲区数据:

    glBindVertexArray( mVertexArray );

glBindBuffer( GL_ARRAY_BUFFER, mBuffers[ BI_ARRAY_BUFFER ] );

glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );

glVertexAttribPointer( 0, 4, GL_FLOAT, GL_FALSE, sizeof( float ) * 8, ( void* ) offsetof( simdColorVert4_t, simdColorVert4_t::position ) );
glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, sizeof( float ) * 8, ( void* ) offsetof( simdColorVert4_t, simdColorVert4_t::color ) );

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mBuffers[ BI_ELEMENT_BUFFER ] );

glBindVertexArray( 0 );

杂项

在立方体初始化之前,这个函数被调用:

void MainScene::setupGL( void )
{
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glDepthRange( 0.0f, 1.0f );

glClearDepth( 1.0f );

int width, height;

gvGetWindowSize( &width, &height );

glViewport( 0, 0, width, height );
}

并且在调用mCube->draw(...) 函数之前清除深度缓冲区。

我认为很明显我在这里做错了什么,但我不确定它可能是什么。在搞乱了背面剔除并在正面的逆时针和顺时针缠绕顺序之间移动之后,这只会让事情变得更糟。有什么想法吗?

最佳答案

尝试将这段代码添加到程序的顶部

//screen cleared as blue
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);

这是我编写的纹理立方体程序,您可能已经实现了其中一些功能,但据我所知,您可能缺少 glDepthFunc(GL_LESS)

关于c++ - 为什么我的一些立方体面没有按照我希望的方式呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15778929/

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