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 法线/光照问题的主要内容,如果未能解决你的问题,请参考以下文章

opengl vbo 纹理

光照在 OpenGL 中不显示

OpenGL 可编程管线 基础光照 的实现

opengl vbo建议[关闭]

现代 OpenGL:VBO、GLM 和矩阵堆栈

着色器中的 OpenGL 法线变换