2014-02-09 2 views
0

간단한 투사를하려하지만 GLM에 문제가 있습니다. 나는이 예제에 문제 코드를 격리시켰다. 모든 것은 glm::vec4 v = mvp * v;까지 올바른 형식입니다. 일치하지 않는 유형 (예 : double 및 float)으로 인해 비슷한 문제가있는 다른 사용자를 읽었습니다. 각 런타임을 변경하는 매우 큰 또는 매우 작은 숫자를 얻고 있습니다. 이것은 나를 무언가가 쓰레기 주소를 어딘가에 가리키고 있다고 믿게한다.이 행렬 곱셈에있어 잘못된 점은 무엇입니까?

vec4와 mat4가 어떤 유형인지 (템플릿으로되어 있는지) 어떻게 알 수 있습니까? 다른 문제가 여기에 있습니까? 내 실수가 거의 없어야한다는 것을 알기 때문에 이것은 실망 스럽지만, 나는 그것을 이해할 수 없다.

#define GLM_FORCE_RADIANS // Hide warnings 
#include <cstdio> 
#include <cstdlib> 
#include <glm/glm.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include <glm/gtc/matrix_transform.hpp> 

void print_mat4(glm::mat4 mat) 
{ 
    int i, j; 
    for (j = 0; j < 4; j++) 
    { 
     for (i = 0; i < 4; i++) 
     { 
      printf("%f\t", mat[i][j]); 
     } 

     printf("\n"); 
    } 
} 

int main() 
{ 
    glm::mat4 projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 
    glm::mat4 view = glm::lookAt(
     glm::vec3(4.0f, 3.0f, 3.0f), 
     glm::vec3(0.0f, 0.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f) 
    ); 

    glm::mat4 model = glm::mat4(1.0f); 
    glm::mat4 mvp = projection * view * model; 


    printf("Projection: \n"); 
    print_mat4(projection); 
    printf("View: \n"); 
    print_mat4(view); 
    printf("Model: \n"); 
    print_mat4(model); 
    printf("MVP: \n"); 
    print_mat4(mvp);; 

    glm::vec4 vert = glm::vec4(-1.0f, -1.0f, 0.0f, 1.0f); 
    glm::vec4 v = mvp * v; 

    printf("\nOriginal: (%f, %f, %f, %f)\n", vert.x, vert.y, vert.z, vert.w); 
    printf("Transformed: (%f, %f, %f, %f)\n", v.x, v.y, v.z, v.w); 

    return 0; 
} 

P. 아무 것도 링크하지 않고이 코드를 컴파일하고 실행할 수 있습니다. g++ matrix_test.cpp -o matrix_test && ./matrix_test

답변

2

GLM에는 아무런 문제가 없습니다. 초기화되지 않은 glm::vec4 v을 곱셈에 사용하고 있습니다.

확인이 라인 :

glm::vec4 v = mvp * v; 

이 대신이 작업을 수행해야합니다

확인
glm::vec4 v = mvp * vert; 
+0

, 그래서이 문제를 해결합니다. 내 실제 프로그램에서 작동하지 않는 이유가 GLSL에 제복을 전달하는 방식이라고 추측합니다. 당신의 답은 큰 도움이됩니다. 왜냐하면 지금은 오류가 행렬의 형성과 관련이 없으므로, 나는 그것들과 함께하고있는 것만을 알고 있습니다. 감사! – unclekyky