OpenGL VBO 法线/光照问题
Posted
技术标签:
【中文标题】OpenGL VBO 法线/光照问题【英文标题】:OpenGL VBO Normals/Lighting Issue 【发布时间】:2012-10-26 01:59:59 【问题描述】:我无法使用 VBO 正确渲染法线。下面是我正在使用的代码,顶点是一个包含顶点的数组,法线是一个包含法线的数组:
//Create the buffers and such
GLuint VBOID;
glGenBuffersARB(1, &VBOID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices) + sizeof(normals), 0, GL_STATIC_DRAW_ARB);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(vertices), vertices);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
///Start loop
cout << "Starting" << endl;
while( window.isOpen() )
sf::Event event;
while( window.pollEvent( event ) )
if( event.type == sf::Event::Closed )
window.close();
fps = FPS.getElapsedTime().asSeconds();
fps = 1 / fps;
FPS.restart();
if(ShowFPS.getElapsedTime().asSeconds() > 1)
cout << "FPS: " << fps << "\t FrameTime: " << 1000 / fps << endl;
ShowFPS.restart();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, 1.0, 1.0, 5000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(5, 5, 5, 0, 0, 0, 0, 1, 0);
//VBO
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOID);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glColor3f(1, 0, 0);
glRotatef(25 * TurnTimer.getElapsedTime().asSeconds(), 0, 1, 0);
glRotatef(15 * TurnTimer.getElapsedTime().asSeconds(), 1, 0, 0);
glNormalPointer(GL_FLOAT, 0, (void*)sizeof(vertices));
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, NumOfF*3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
window.display();
【问题讨论】:
【参考方案1】:glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(vertices), vertices);
好的,那么您为 normals 执行此操作的部分在哪里?
另外,请停止使用 ARB 扩展功能。近十年来,它一直是 OpenGL 的核心功能;已经删除了 ARB 后缀。
【讨论】:
啊,谢谢,解决了。我使用 ARB 扩展的原因是因为我正在关注 NeHe 教程,这些教程有点过时了。 @LucasS “这有点过时了” - 这正是你应该不关注他们的原因。 NeHe 在过去一直是一个很好的资源,但即使是最好的(不是暗示它们是)和最广为人知的教程也应该有机会有尊严地退休。以上是关于OpenGL VBO 法线/光照问题的主要内容,如果未能解决你的问题,请参考以下文章