1

VSyncのオンとオフを問わず、さまざまなマシンを試しました。

主な方法と表示方法を提供しました。メインルックでは、GLFWのGetTimeメソッドを使用してデルタを計算します。

deltaTime = 0.016を明示的に設定して目標速度をロックすると、三角形はスムーズに移動します。

int main(int argc, char** argv)
{
    /*
        INIT AND OTHER STUFF SNIPPED OUT
    */

    double currentFrame = glfwGetTime();
    double lastFrame = currentFrame;
    double deltaTime;

    double a=0;
    double speed = 0.6;
    //Main loop
    while(true)
    {
        a++;

        currentFrame = glfwGetTime();
        deltaTime = currentFrame - lastFrame;
        lastFrame = currentFrame;

        /** I know that delta time is around 0.016 at my framerate **/
        //deltaTime = 0.016;

        x = sin( a * deltaTime * speed ) * 0.8f;
        y = cos( a * deltaTime * speed ) * 0.8f;

        display();

        if(glfwGetKey(GLFW_KEY_ESC) || !glfwGetWindowParam(GLFW_OPENED))
            break;
    }

    glfwTerminate();

    return 0;
}

void display()
{
    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(playerProgram);

        glUniform3f(playerLocationUniform,x,y,z);

        glBindBuffer(GL_ARRAY_BUFFER, playerVertexBufferObject);

        glEnableVertexAttribArray(0);
            glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
            glDrawArrays(GL_TRIANGLES, 0, 3);
        glDisableVertexAttribArray(0);

    glUseProgram(0);
    glfwSwapBuffers();

}
4

1 に答える 1

5

グローバルフレームレートであるかのように使用し、フレーム番号( )にそのレートを掛けたものdeltaTimeに基づいてサインとコサインを計算しています。aつまり、deltaTimeフレーム間のわずかな変動は、大きくaなるにつれて位置の大きな変化を引き起こします。

他のケースでは、定数を設定するdeltaTimeと、フレームが間違った時間にレンダリングされたときに小さなグリッチが発生します。

あなたが実際に行う必要があるのはこれです:

#define TAU (M_PI * 2.0)

    currentFrame = glfwGetTime();
    deltaTime = currentFrame - lastFrame;
    lastFrame = currentFrame;

    a += deltaTime * speed;

    // Optional, keep the cycle bounded to reduce precision errors
    // if you plan to leave this running for a long time...
    if( a > TAU ) a -= TAU;

    x = sin( a ) * 0.8f;
    y = cos( a ) * 0.8f;
于 2012-09-25T00:45:01.887 に答える