Lập trình đồ họa với OpenGL

Chào các bạn. Mình đã tự học OpenGL được một thời gian rồi. Mục tiêu mình là đi chuyên sâu vào đồ họa nên mình mới học về OpenGL cũng như các môn toán liên quan.
Đây là sản phẩm mình đang phát triển: https://www.youtube.com/watch?v=EOvexANgNAQ&index=5&list=PLGYYiX8Kj9K3RYi7X-zqCyB_tTvg-1ILh

Bởi vì học chán quá nên tìm các bạn đang học hoặc có ý định học kết bạn lập nhóm để trao đổi cho vui. :v

3 Likes

Dùng forward hay deferred shading vậy em :smile:

Forward Shading a. Deferred Shading e chưa có tìm hiểu. Tại vì e thích Game Architecture hơn. Mà máy e card cái con Intel HD nên OpenGL chỉ được tới 3.1

Ừa, nếu làm animation thôi thì cũng không cần tới Deferred đâu, với lại cũng không nhiều model nên dùng forward nhẹ hơn. A k biết e dùng Intel HD đời mấy nhưng nhìu dòng Intel HD vẫn render đủ đáp ứng và chơi được kha khá game 3D, nhưng trong clip của e thì khá là giật lag. Có vẻ e chưa tối ưu tốt, e nên chia sẽ bớt những phần tính toán nhất là logic và các phép chia, sin, cos… cho application level thay vì đẩy qua shading level tính hết. Mà e tính ligting bằng công thức gì, Phong hay Blinn-Phong.

Anh có thể chia sẻ cho em tài liệu mà anh tự học được không ạ :smile: , em cũng muốn học OpenGL lắm.

anh học ở đâu vậy ? cho em học cùng với :laughing:

E toàn để MVP bên shader. Không biết như thế có ổn không.Lighting e tính bằng Phong shading a. E không hiểu sao FPS lại thấp đến như thế. Nếu render Sky không thì được 500FPS. Thêm vào Terrain thì được tầm 200FPS. thêm skeleton model vào thì tụt xuống 30FPS. e đang đã thêm Frustum Culling cho skeleton model thì FPS cải thiện được một ít nhưng không quá nhiều. E đang định thêm Frustum Culling cho Terrain mà không biết làm thế nào.

Bùi Thế Khải và Phạm Minh Anh Hữu: Mục đích bạn học OpenGL để làm gì ? nếu để cho biết thì khuyên là đừng nên học.

Không nên để MVP bên shading đâu e, vì nếu vậy e phải stream 3 matrix qua. E nên tính MVP bên application xong rồi stream matrix kết quả qua sẽ tiết kiệm thời gian hơn, bởi vậy e dùng animation nó tuột fps thảm thương là phải rồi. Với lại e nên dùng Blinn-Phong thay vì Phong shading, nó không khác nhiều Phong shading đâu, chỉ khác quá trình tính specular color thôi, nó giúp e lượt bỏ quá trình tính reflect vector, mà dùng 1 mẹo khác để thay thế nhưng màu sắc tính ra k khác gì Phong shading nhưng hiệu năng cải thiện rất đáng kể. Mà hình như e chạy ở chế độ debug đúng không, đổi qua chạy ở chế độ release đi fps sẽ cải thiện nhiều lắm.

Việc dùng Frustum Culling cho Terrian khá là phúc tạp đó e, có khi còn kéo fps xuống nữa, thay vì Culling thì e thử dùng Tesselation xem sao.

Máy e chạy OpenGL 3.1 không hỗ trợ Geometry Shader huống gì Tesselation Shader. E thử chuyển sang Release chạy bị lỗi mặc dù ở Debug chạy ngon lành.

Sau khi e sửa lại hết Shader thì FPS cải thiện đáng kể. Thêm Frustum Culling nữa thì được 100FPS. Hiện tại e cải thiện hiệu suất cho phần cập nhật của skeleton animation.

1 Like

Em không học cho biết, em nghĩ sẽ theo về phần đồ hoạ máy tính, game 3D. Biết là khó nhưng em muốn học và theo nó. :slight_smile:

Nếu e đã nói thế thì đầu tiên e nên học toán 3D. A có thể giới thiệu cuốn 3D Math Primer for Computer Graphic. Cuốn này đề cập đến những kiến thức toán cơ bản nhất cho đồ họa. OpenGL thì e có thể tìm cuốn OpenGL SuperBible hoặc OpenGL Programming Guide tùy theo phiên bản OpenGL trên máy e mà học. Đó là những kiến thức nền cơ bản cùa đồ họa.

1 Like

Cảm ơn anh giới thiệu về 3 cuốn sách, phiên bản OpenGL trên máy em là 4.0

game, 3d , đồ họa, phim 3d/animation blablabla … :laughing:

Chào anh, em có 1 thắc mắc nhỏ mong anh giải đáp.
Bên Vertex Shader em để là
gl_Position = P * V * M * pos; thì thứ tự thực hiện từ phải qua trái à, hay là do toán tử * của 1 matrix với 1 vector được ưu tiên hơn với 2 matrix.
Còn nếu em để MVP bên app: matResult = M * V * P; cũng bị sai còn sửa ngược lại matResult = P * V * M; thì đúng. Em dùng thư viện glm, thế thứ tự thực hiện phép nhân này sao lại từ phải qua trái ?

Chào e. Đầu tiên là phép toán gl_Position = P * V * M * pos; Phép toán này đầu tiên được tách ra thành P * V * M sau đó mới nhân cho pos. Trong GLSL thì ma trận theo thứ tự là column-major nên các phép biến đổi sẽ được thực hiện từ phải qua trái. Sau đó kết quả của phép biển đồi này mới được nhân cho pos.

Thứ 2 là phép toán matResult = M * V * P; Trong glm thì ma trận cũng được lưu theo column-major nên phép biến đổi cũng là từ phải qua trái. mat4 của nó chứa 4 cột của ma trận.

1 Like

Dạ em cảm ơn anh, anh cho em hỏi nữa là nếu là ma trận row-major thì sẽ nhân theo trái qua phải đúng không ạ, và column-major khác với row-major như thế nào.
Em thấy có 2 cái Transformation Matrix là:

Cái thứ nhất:
[ 1 0 0 x ]
| 0 1 0 y |
| 0 0 1 z |
[ 0 0 0 1 ]
Cái thứ hai:
[ 1 0 0 0 ]
| 0 1 0 0 |
| 0 0 1 0 |
[ x y z 1 ]

Thì cái matrix đầu là theo column-major còn cái thứ 2 là row-major phải không ạ?
Và với row-major thì nhân pos với matrix là nhân 2 matrix này:

[ pos.x pos.y pos.z 1] * M 

Em nói như trên đã đúng chưa anh. :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?