CHƯƠNG XIV – SCENE TRANSITION

Link Source code HD không che: https://goo.gl/GyJNcw 
Các bạn nên mở sources code vừa đọc vừa so sánh với tut này vì mình sẽ giải thích những gì trong sources code.



1. Sơ lược

  • Đây là phần nâng cao nên các bạn có thể không đọc cũng được.

  • Kiến thức để hiểu rõ cái này có liên quan đến Shader và HLSL nên các bạn có thể tìm hiểu thêm ở trên google rồi xem qua code vì mình cũng tìm tòi và sưu tập được.

  • Cơ chế của Shader khá phức tạp (đối với mình) nên mình cũng chưa nắm rõ hết được, nên chỉ làm theo trên mạng trình bày và áp dụng vào đây.

  • Những Code trong này đều mang tính chất tham khảo.


2. Shader

  • Shader là một chương trình đặc biệt được viết ra để chạy trên GPU tức bộ xử lý đồ hoạ.

  • Trên trang chủ của Unity định nghĩa shader là những script nhỏ gồm các phép toán và thuật toán để tính toán màu sắc cho mỗi điểm ảnh render lên , dựa trên ánh sáng và cấu hình vật liệu . 
  • Shader được áp dụng cho lập trình 3D vì việc tính toán các phép toán 3D để vẽ hình nên rất nhiều và cần sự trợ giúp của Card đồ họa nên phải có 1 ngôn ngữ giúp ta xử lý những hình ảnh này trên card đồ họa.
  • DirectX thì có HLSL (High Level Shader Language), OpenGL thì có GLSL (OpenGL Shader Language),... các bạn có thể google để tìm hiểu sâu hơn về Shader mình sẽ không nói ở đây vì kiến thức phần này mình không nắm chắc nên không thể nói được. Trình độ của mình chỉ là biết chứ chưa hiểu rõ về phần này. 
  • Để sử dụng Shader này các class cần thiết mình đã tạo và để trong Folder Transition.


3. Class Scene

  • Ở class Scene mình sẽ thêm hàm Render.
void Scene::Render()
{
    auto device = GameGlobal::GetCurrentDevice();
    //begin render
    device->Clear(0, NULLD3DCLEAR_TARGETthis->mBackColor, 0.0f, 0);
    device->BeginScene();
    //draw
    GameGlobal::GetCurrentSpriteHandler()->Begin(D3DXSPRITE_ALPHABLEND);
    Draw();
    GameGlobal::GetCurrentSpriteHandler()->End();
    //end render
    device->EndScene();
    device->Present(NULLNULLNULLNULL);
}
  • Hàm này cõ nhiệm vụ là vẽ Scene này lên Backbuffer (Surface) ngay, bởi vì khi chuyển Scene bằng hiệu ứng thì mình sẽ cần 2 màn hình của 2 Scene, 1 màn hình trạng thái Scene hiện tại và 1 màn hình trạng thái Scene cần chuyển, mình sẽ Render Scene lên Surface rồi sẽ lấy Texture từ Surface truyền xuống Shader để xử lý effect. Giống như Scene cũ sẽ đè lên Scene mới rồi mình sẽ quét xóa đi Scene cũ để Scene mới hiện ra.

4. Class Shader

  • Class này cho phép mình load file shader. Các code của file shader mình có để trong thư mục Resources/Shader
Hàm load file Shader

D3DXCreateEffectFromFileA(GameGlobal::GetCurrentDevice(), sourceFile.c_str(), 0, 0, 0, 0, &pShader ,&error)

5. Class TransitionEffect

  • Là 1 Abstract class chứa thông tin các Vertex (các bạn google tìm hiểu thêm nhé). Và các hàm cần thiết để thực hiện 1 hiệu ứng. Muốn tạo một hiệu ứng mới thì kế thừa class này và code phần Update.
  • Thuộc tính:
    • Shader *shader: chứa thông tin shader cần dùng.
    • LPDIRECT3DVERTEXBUFFER9 vertexBuffer: chứa thông tin của vertex.
    • Scene *mSceneSource, *mSceneDest: Scene cũ và Scene mới sẽ thay thế.


  • Hàm:
    • virtual void Update(float dt): hàm update sẽ update những thông tin cần thiết rồi truyền qua file Shader.

    • virtual bool IsFinish(): trả về true khi hiệu ứng kết thúc, hàm này các bạn phải tùy chỉnh tùy theo loại hiệu ứng và kết thúc khác nhau để chuyển Scene.

    • virtual void DoAfterSetScene(): hàm này sẽ được gọi sau khi set Scene Replace vì sau khi có 2 Scene mình sẽ cần chụp 2 màn hình Scene lại để tạo hiệu ứng.

    • virtual void InitvertexData(): khởi tạo các thông tin của Vertex để truyền vào Shader.

    • virtual void OnFinish(): được gọi khi kết thúc hiệu ứng chuyển Scene và sẽ chuyển Scene cần chuyển.

6. Class TransitionCircleScan

  • Là hiệu ứng quét màn hình để chuyển scene.




  • Vì Shader sẽ xử lý ảnh trên từng pixel một, nên những pixel nào tạo ra góc so với trục Ox (O là gốc ở giữa màn hình) nhỏ hơn số Alpha thì mình sẽ để nó là màu của Scene mới còn ngược lại là màu Scene cũ.

  • Những bạn nào hiểu có thể xem thêm trong file HLSL và code để tham khảo nhé.
  • Update ma trận
mtxViewProj._11 = 2.0;
mtxViewProj._22 = -2.0; 
mtxViewProj._41 = -1.0;
mtxViewProj._42 = 1.0;

  • Nếu bạn đọc qua thì hệ tọa độ của HLSL khi vẽ lên là [-1, 1] còn hệ tọa độ màn hình là [0, Width] và [0, Height] nên mình chỉnh sửa để phù hợp với hệ tọa độ về dạng [0, 1].
Share on Google Plus

About Lộc Thọ

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.

2 Comment: