2012-01-25 25 views
10

Tôi đang gặp vấn đề kỳ quặc này và tôi hy vọng một người nào đó có thể giải thích điều này cho tôi để tôi có thể hiểu những gì sai và hành động phù hợp. Trong OpenGL (hàm cố định), tôi vẽ một ống với các khuôn mặt bên trong trong một phép chiếu trực quan.Biến dạng phối cảnh Opengl

Hình ảnh bên dưới hiển thị kết quả. Nó bao gồm 4 vòng đỉnh được hình thành tam giác bằng cách sử dụng mô hình chỉ số được hiển thị ở bên trái. Tôi đánh số các đỉnh trên ống để thuận tiện cho bạn. Ở bên phải là kết cấu được sử dụng:

enter image description here

Như bạn có thể thấy các kết cấu đã được bóp méo nặng nề. Khi tôi bước đầu tạo ra ống chỉ có 2 vòng đỉnh, tôi nghĩ việc tăng số lượng vòng sẽ khắc phục sự biến dạng nhưng không có niềm vui. Ngoài ra glHint dường như không ảnh hưởng đến vấn đề cụ thể này.

Tọa độ kết cấu dường như không sao. Ngoài ra, mẫu trình kiểm tra dường như hiển thị chính xác, nhưng tôi đoán rằng sự biến dạng chỉ không hiển thị trong mẫu rất cụ thể đó.

Vui lòng bỏ qua các đường gạch chéo vì một trong những đường này là cạnh không tồn tại; Tôi trả lại wireframe qua GL_LINE_LOOP.

+0

điều này có thể là do bạn đang sử dụng phép chiếu chính tả không? – geofftnz

Trả lời

2

Hiệu ứng cụ thể này là do cách tọa độ kết cấu được nội suy trong một hình tam giác. Điều xảy ra là, một hướng trở thành thành phần chính, trong khi hướng kia bị lệch. Mẫu vật của bạn xảy ra là rất dễ bị này. Điều này cũng xảy ra là một vấn đề với dự báo phối cảnh và kết cấu trên sàn nhà hoặc tường. Những gì bạn cần được gọi là PCT "phối cảnh chính xác". Có một glHint cho điều này nhưng tôi đoán, bạn đã thử điều đó.

Thẳng thắn rằng cách duy nhất để tránh điều này là chia nhỏ cũng áp dụng hiệu chỉnh phối cảnh. Nhưng may mắn thay điều này là dễ dàng đủ cho địa lý tứ giác dựa trên (như của bạn). Khi chia nhỏ các cạnh nội suy, kết cấu tọa độ tại các trung tâm phân khu dọc theo tất cả 4 cạnh và sử dụng giá trị trung bình của 4 cạnh. Nội suy các tọa độ kết cấu chỉ dọc theo một cạnh là chính xác những gì bạn muốn tránh.

Nếu bạn muốn giữ cho dữ liệu hình học không bị ảnh hưởng, bạn có thể triển khai PCT trong trình đổ bóng phân đoạn.

+0

Trong khi tôi thử thêm nhiều vòng, tôi không thử thêm nhiều đỉnh hơn cho mỗi vòng, điều này giải quyết được vấn đề. Vì vậy, thực sự, chia nhỏ là con đường để đi. Cảm ơn! –

0

Hãy thử một số phân khu:

template< typename Vec > 
void glVec2d(const Vec& vec) 
{ 
    glVertex2f(static_cast<float>(vec.x()) , static_cast<float>(vec.y())); 
} 

template< typename Vec > 
void glTex2d(const Vec& vec) 
{ 
    glTexCoord2f(static_cast<float>(vec.x()) , static_cast<float>(vec.y())); 
} 

template< typename Vec > 
void glQuad 
    (
    const Vec& A, 
    const Vec& B, 
    const Vec& C, 
    const Vec& D, 
    unsigned int divs = 2, 
    const Vec& At = Vec(0,0), 
    const Vec& Bt = Vec(1,0), 
    const Vec& Ct = Vec(1,1), 
    const Vec& Dt = Vec(0,1) 
    ) 
{ 
    // base case 
    if(divs == 0) 
    { 
     glTex2d(At); 
     glVec2d(A); 

     glTex2d(Bt); 
     glVec2d(B); 

     glTex2d(Ct); 
     glVec2d(C); 

     glTex2d(Dt); 
     glVec2d(D); 

     return; 
    } 

    Vec AB = (A+B) * 0.5; 
    Vec BC = (B+C) * 0.5; 
    Vec CD = (C+D) * 0.5; 
    Vec AD = (A+D) * 0.5; 
    Vec ABCD = (AB+CD) * 0.5; 

    Vec ABt = (At+Bt) * 0.5; 
    Vec BCt = (Bt+Ct) * 0.5; 
    Vec CDt = (Ct+Dt) * 0.5; 
    Vec ADt = (At+Dt) * 0.5; 
    Vec ABCDt = (ABt+CDt) * 0.5; 

    // subdivided point layout 
    // D CD C 
    // 
    // AD ABCD BC 
    // 
    // A AB B 

    // subdivide 
    glQuad2d(A, AB, ABCD, AD, divs - 1, At, ABt, ABCDt, ADt); 
    glQuad2d(AB, B, BC, ABCD, divs - 1, ABt, Bt, BCt, ABCDt); 
    glQuad2d(ABCD, BC, C, CD, divs - 1, ABCDt, BCt, Ct, CDt); 
    glQuad2d(AD, ABCD, CD, D, divs - 1, ADt, ABCDt, CDt, Dt); 
} 

Tôi thường sử dụng Eigen::Vector2f cho Vec.

0

Tại sao bạn sử dụng phép chiếu chính xác cho điều này? Nếu bạn đang sử dụng phép chiếu phối cảnh, OpenGL sẽ sửa chữa ánh xạ kết cấu cho bạn.