Tôi nên lo lắng điều gì khi thay đổi nguồn gốc OpenGL sang phía trên bên trái màn hình?


11

Để tự học, tôi đang viết một công cụ platformer 2D bằng C ++ bằng SDL / OpenGL. Ban đầu tôi bắt đầu với SDL thuần túy bằng cách sử dụng các hướng dẫn trên sdltutorials.com và lazyfoo.net, nhưng giờ tôi đang sử dụng SDL để tạo bối cảnh kết xuất OpenGL và sau đó kết xuất với các chức năng OpenGL (cụ thể là chế độ tức thời nhưng tôi đang tìm hiểu về VAO / VBO ). Tôi chỉ sử dụng SDL cho giao diện, âm thanh, v.v.

SDL sử dụng hệ tọa độ có gốc tọa độ ở phía trên bên trái màn hình và trục y dương hướng xuống dưới. Thật dễ dàng để thiết lập phép chiếu chính tả của tôi trong OpenGL để phản ánh điều này.

Tôi biết rằng tọa độ kết cấu là một hệ thống bên phải với các giá trị từ 0 đến 1 - lật kết cấu theo chiều dọc trước khi kết xuất (tốt, lật tệp trước khi tải) mang lại kết cấu hiển thị chính xác ... sẽ ổn nếu tôi vẽ toàn bộ kết cấu, nhưng cuối cùng tôi sẽ sử dụng các ô và có thể tưởng tượng ra các vấn đề.

Tôi nên quan tâm điều gì về kết xuất khi tôi làm điều này?

Nếu bất cứ ai có lời khuyên hoặc họ đã tự thực hiện điều này và có thể chỉ ra những cạm bẫy trong tương lai, điều đó sẽ rất tuyệt, nhưng thực sự mọi suy nghĩ sẽ được đánh giá cao.


1
Bạn đang sử dụng SDL để kết xuất (như trong các chức năng làm mờ của SDL) hay bạn đang sử dụng SDL để tạo bối cảnh kết xuất OpenGL, sau đó sử dụng các chức năng OpenGL để kết xuất?
Nicol Bolas

1
Tôi đang sử dụng SDL để tạo bối cảnh kết xuất OpenGL và sử dụng các chức năng OpenGL để kết xuất. Tôi sẽ làm rõ điều này trong câu hỏi.
phái sinh

1
Có thể nếu bạn sẽ sử dụng một hệ thống vật lý, hãy xem tốt hơn hệ thống tọa độ mà nó sử dụng (thuận tay hoặc thuận tay trái, Y-UP hoặc Y-DOWN) và tiếp tục sử dụng tương tự. Tất nhiên bạn có thể làm những việc như đảo ngược trọng lực, nhưng tôi sẽ cố gắng sử dụng tương tự để làm cho nó dễ dàng hơn.
Gustavo Maciel

Câu trả lời:


8

"Tôi nên quan tâm điều gì về kết xuất khi tôi làm điều này?" - không nhiều. Một hệ thống phối hợp chỉ là một quy ước, không phải là một quy tắc khó và nhanh, và đây là một điều hoàn toàn hợp pháp và hợp lệ để làm. Chỉ cần chắc chắn rằng bạn nhất quán trong cách sử dụng của riêng bạn và mọi thứ sẽ hoạt động tốt.


Tuyệt quá! Tôi có một sự linh hoạt bản thân linh cảm là điều duy nhất tôi cần phải lo lắng, nhưng đây là lãnh thổ mới đối với tôi.
phái sinh

1
Tôi nên nói thêm rằng Quake cũ thân yêu đã làm điều này vào năm 1996 và nó hoạt động rất tốt.
Maximus Minimus

5

Khi làm việc ở dạng 2D với OpenGL, tôi thường sử dụng góc trên cùng bên trái làm gốc. Điều này có thể được thực hiện với:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

Tuy nhiên, có một số cạm bẫy khi thay đổi nguồn gốc sang phía trên bên trái.

Một cạm bẫy tôi đã gặp phải hơn một lần: glScissor() , được sử dụng để cắt, luôn sử dụng tọa độ phía dưới bên trái.

Chữ ký của nó là:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

trong đó x, ychỉ định phía dưới bên trái của hộp cắt kéo.

Tổng quát hơn, bất kỳ chức năng nào hoạt động trong tọa độ cửa sổ đều sử dụng phía dưới bên trái làm gốc. Điều này bao gồm các chức năng như gluProject, gluUnProject,glCopyPixels vv

Nhưng một số chức năng như glDrawPixelssử dụng glRasterPosđể định vị và glRasterPossử dụng tọa độ đối tượng (được chuyển đổi) .

Nếu bạn đang chạy trên Linux và biết cách sử dụng man, bạn có thể muốn lấy một bản sao của các trang web OpenGL tại đây: ftp://ftp.sgi.com/sgi/opengl/doc/ Tôi thấy chúng là thời gian thực- tiết kiệm.

Ngoài ra, tôi nhận thấy bạn nói "lật tập tin trước khi tải" kết cấu. Điều này thì không cần thiết. Thay vì lật hình ảnh khi tải nó, chỉ cần lật tọa độ kết cấu để đi từ 1.0 đến 0.0 khi kết xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.