2013-04-04 3 views
0

Цель моей программы - показать простой цветной треугольник, вращающийся по оси Y без какого-либо перевода. Я использую библиотеку GLM. Проблема в том, что преобразования моего треугольника неверны: у него странное и нелогичное поведение. Вот мой код на С ++ плюс вершинные шейдеры и пиксельный шейдер код:Неверные вращения с использованием openGL GLM и шейдеров

C++ код:

float angle = 0.0f; 

struct Vertex 
{ 
    float x, y, z; 
}; 

static Vertex vertices[9] = 
{ 
    -1.000000f, 0.000000f, 0.000000f, 
    0.000000f, 1.000000f, 0.000000f, 
    1.000000f, 0.000000f, 0.000000f 
}; 

static Vertex colors[9] = 
{ 
    1.000000f, 0.000000f, 0.000000f, 
    0.000000f, 1.000000f, 0.000000f, 
    0.000000f, 0.000000f, 1.000000f 
}; 

[...] 

int     
main(int ac, char **av) 
{ 
    bool   continuer = true; 
    SDL_Event  event; 
    GLuint   vboID[2]; 
    GLuint   programID = 0; 

    //SDL window initialization 

    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("VBO tests",NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL); 

    //Viewport initialization 

    glViewport(0, 0, WIDTH, HEIGHT); 

    //Projection initialization 

    glm::mat4 projection = glm::mat4(1.0f); 
    projection = glm::perspective<GLfloat>(60.0f, (float)(WIDTH/HEIGHT), 1.0f, 1000.0f); 

    //View initialization 

    glm::mat4 view = glm::lookAt<GLfloat>(glm::vec3(0.0f, 0.0f, 8.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); 

    glewInit(); 

    //Shaders initialization 

    programID = initShaders("triangle.vert", "triangle.frag"); 

    //Main loop 

    while (continuer) 
    { 
     eventListener(&event, &continuer); 

     glClearDepth(1.0f); 
     glClearColor(0.13f, 0.12f, 0.13f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glUseProgram(programID); 

     //Model transformations 

     glm::mat4 model = glm::mat4(1.0f); 
     model *= glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f)); 
     model *= glm::rotate(model, angle, glm::vec3(0.0f, 1.0f, 0.0f)); 

     glm::mat4 ModelViewMatrix = model * view; 
     glm::mat4 ModelViewProjectionMatrix = projection * ModelViewMatrix; 

     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices); 
     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, colors); 

     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 

     glUniformMatrix4fv(glGetUniformLocation(programID, "ModelView"), 1, GL_TRUE, glm::value_ptr(ModelViewMatrix)); 
     glUniformMatrix4fv(glGetUniformLocation(programID, "MVP"), 1, GL_TRUE, glm::value_ptr(ModelViewProjectionMatrix)); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glDisableVertexAttribArray(1); 
     glDisableVertexAttribArray(0); 

     glUseProgram(0); 

     angle += 0.020f; 

     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 

    SDL_Quit(); 
    return (0); 
} 

Vertex код шейдера:

#version 330 

in vec3 VertexPosition; 
in vec3 VertexColor; 

uniform mat4 ModelViewMatrix; 
uniform mat4 MVP; 

out vec3 Color; 

void main() 
{ 
    Color = VertexColor; 

    gl_Position = MVP * vec4(VertexPosition, 1.0f); 
} 

фрагмент кода шейдера:

#version 330 

in vec3 Color; 
out vec4 FragColor; 

void main() { 
    FragColor = vec4(Color, 1.0); 
} 

Когда Я объявляю простое вращение матрицы для модели, я отправляю ее в вершинный шейдер, и я использую ее как M VP и работает. Но когда я добавляю матрицу проекции + матрицу вида, она работает неправильно. Вот картинка:

enter image description here

Как правило, треугольник должен быть в центре экрана.

Кто-нибудь может мне помочь?

+0

Что вы имеете в виду, когда говорите «когда я добавляю матрицу проекции + матрицу зрения, она работает неправильно»? Добавить к чему? Что не работает правильно? Что вы видите на экране? – PowerApp101

+0

Я хотел сказать, когда я мутирую структуру представлений, проекций и моделей вместе. У меня плохой рендер выше на моей картинке. Но когда я стираю представление и проекцию в моем коде, и я держу только матрицу трансформации модели, она работает. Треугольник ближе, конечно, потому, что у меня нет вида и проекции, но он правильно поворачивает Y-топор. Я хочу иметь такое же поведение, но с проекцией и матрицей вида. Является ли мой код правильным для вас? (C++ и вершинный шейдер) – user1364743

+0

Не могли бы вы разместить код, в котором вы создаете матрицу просмотра и проекции, и где вы умножаете свои матрицы вместе? – bwroga

ответ

1

Эта линия:

glm::mat4 ModelViewMatrix = model * view; 

Если, вероятно, следующим образом:

glm::mat4 ModelViewMatrix = view * model; 

Матричные вычисления выполняются в обратном порядке, и вы хотите, чтобы первый умножьте вершину по модели матрицы, а не зрения.

Вы также можете взглянуть на my other answer, объяснив эти понятия немного.

+0

Спасибо за ваш ответ. – user1364743

 Смежные вопросы

  • Нет связанных вопросов^_^