gpt4 book ai didi

c++ - GL Buffer 设置为 GL_STATIC_DRAW 但需要发送每一帧

转载 作者:行者123 更新时间:2023-11-30 04:17:53 26 4
gpt4 key购买 nike

我正在准备一些具有 2f 个顶点、2f 个顶点和 4f 个颜色的缓冲区。它显示正确。整个事情都在一个类(class)里。如果我有更多实例(每次生成它自己的缓冲区 ID,从未传入函数,因此它不会被清理,作为指针包装在 std::list 中)仅在第一次绘制期间(使用 gdb 第一次绘制后暂停,我看到所有缓冲的东西)所有缓冲的数据都是可见的。在下一次绘制中,只有最后绘制的缓冲区是可见的。

我通过以下调用来生成、绑定(bind)然后用数据填充缓冲区来准备它们:

glBufferData( GL_ARRAY_BUFFER, Size * 8 * sizeof( float ), f, GL_STATIC_DRAW );

其中 Size 是一个 std::size_t 与顶点数和 f float 组。要绘制我绑定(bind)的缓冲区,请激活客户端状态:GL_VERTEX_ARRAY、GL_TEXTURE_COORD_ARRAY、GL_COLOR_ARRAY。

glDrawArrays( Mode, 0, Size );

其中 Mode 是一个带有 GL_TRIANGLES 的 GLenum。

我通过在每一帧的 glDrawArrays 之前调用 glBufferData 来修复它,但这不是它应该的样子。它应该是通过绑定(bind)和调用 glDrawArrays 生成、绑定(bind)、填充然后绘制,不是吗?

如有必要:我在 Windows 7 x64 上使用 C++、gcc。我被要求提供更多代码:

void Buffer::CopyToGPU( )
{
glBindBuffer( GL_ARRAY_BUFFER, Object );
float* f = new float[ Size * 8 ];
for ( std::size_t s( 0 ) ; s < Size ; ++s )
CopyVertexToFloatArray( &f[ s * 8 ], Vortex[ s ] );
glBufferData( GL_ARRAY_BUFFER, Size * 8 * sizeof( float ), f, GL_STATIC_DRAW );
delete[] f;

glVertexPointer( 2, GL_FLOAT, 8 * sizeof( float ), NULL );
glTexCoordPointer( 2, GL_FLOAT, 8 * sizeof( float ), (char*)( 2 * sizeof( float ) ) );
glColorPointer( 4, GL_FLOAT, 8 * sizeof( float ), (char*)( 4 * sizeof( float ) ) );
}
void Buffer::Render( )
{
glBindBuffer( GL_ARRAY_BUFFER, Object );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );

//Actually draw the triangle, giving the number of vertices provided
glDrawArrays( Mode, 0, Size );

glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
}
int main( ... ) // stripped buffer sfml2 initialization etc.
{
glClearColor( 0, 0, 0, 1 );

glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_GREATER , 0.1 );
glEnable( GL_TEXTURE_2D );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

while ( win.isOpen( ) ) // sf::Window
{
/// draw
glClear( GL_COLOR_BUFFER_BIT );
MVP.Apply( );
CallDraw( );
win.display( );
}
}

最佳答案

您似乎在更新缓冲区对象时指定了属性指针。这不是它的工作原理。顶点属性指针(取决于 GL 版本)要么是全局状态,要么是每个 VAO 状态,但绝不是每个 VBO 状态。目前,当你做类似的事情时

bufferA.CopyToGPU();
bufferB.CopyToGPU();
while(true) {
bufferA.render();
bufferB.render();
}

只有缓冲区 B 会被使用(留下越界访问的可能性,因为你认为你在渲染它时使用缓冲区 A),因为在第二次调用中顶点数组状态被设置为缓冲区 B,覆盖任何属性指针在第一次通话中设置。您需要在绘制每个对象时重新指定指针,或者使用顶点数组对象来封装这些指针。请注意,后一条路径在 GL >= 3.X 核心配置文件中是强制性的。

关于c++ - GL Buffer 设置为 GL_STATIC_DRAW 但需要发送每一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16776215/

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