Home > 圖像編程 > 實作簡單的材質

實作簡單的材質

進度有點緩慢,今天才完成了 3月6日定下的第一個目標。

使用 blinn_bump_reflect.fx 的渲染

今天的學習進度:

  1. 設定 Matrices 及修正相關函式: 現時設定為 column-major。改正相關函式花了很多時間。
  2. 修改 ChamferBox: 由於 ChamferBox 只負責生成一個 Geometry 物件,所以把 constructor 改為一個 function。原本想嘗試做一個 non-member function,但是 SWIG 部份有問題,花了一兩個小時也找不到解決辦法,所以現在改為一個 static member function。
  3. 實作 Material: 使用 HLSL fx 檔案在建構一個 Material (在 Direct3D9 上而已,之後再考慮跨平台的設計)。利用 FX Composer 的 Blinn.fx 測試渲染。
  4. 加入 Texture: 因為 blinn.fx 需要 diffuse texture,又實作了一個 Texture 類別,和 Material 相似,也是從 constructor 讀入一個影像檔案。
  5. 測試 blinn_bump_reflect.fx: 因為這個 Effect 需要 Tangent 和 Binormal,所以實作了
    void GeometryBuilder::ComputeTangentSpace(int texcoordIndex)

    函式從三角形網格計算這些向量,當中參考了這個網站的實作

  6. 加入 CubeTexture: blinn_bump_reflect.fx 需要環境貼圖,因此加入這個類別。並重構 Texture,使 Texture 和 CubeTexture 繼函自 TextureBase。

測試程式

public partial class Test1 : Form
{
    public void Run()
    {
        Device device = Device.Instance();

        device.Clear(new Color(0.0f, 0.0f, 0.0f, 0.0f));
        device.BeginScene();

        device.SetProjection(Matrix44.Perspective(-0.05f, 0.05f, -0.05f, 0.05f, 0.1f, 1000));
        device.SetView(Matrix44.LookAt(new Vector3(0.0f, 2.0f, 2.0f), new Vector3(0, 0, 0), new Vector3(0, 1, 0)));
        device.SetWorld(Matrix44.Rotate(new Vector3(0, -0.1f * (float)((DateTime.Now - start).TotalSeconds * 2 * System.Math.PI), 0)));
        device.SetMaterial(material);
        device.DrawGeometry(geometry);

        device.EndScene();
        device.Present();
    }

    private void Test1_Load(object sender, EventArgs e)
    {
        Device.Instance().Open(Handle.ToInt32());

        geometry = new Geometry();
        ChamferBox.Create(geometry, new Vector3(2, 2, 2), 0.99f, 5);

        material = new Material("Effect/blinn_bump_reflect.fx");
        material.SetTexture(material.GetParameterBySemantic("DIFFUSE"), new Texture("Texture/rockwall.jpg"));
        material.SetTexture(material.GetParameterBySemantic("ENVIRONMENT"), new CubeTexture("Texture/Default_reflection.dds"));
        material.SetTexture(material.GetParameterByName("NormalTexture"), new Texture("Texture/rockwall.tga"));

        start = DateTime.Now;
    }
    private Geometry geometry;
    private Material material;
    private DateTime start;
}

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://miloyip.seezone.net/wp-trackback.php?p=37
Listed below are links to weblogs that reference
實作簡單的材質 from Milo的遊戲開發

Home > 圖像編程 > 實作簡單的材質

Search
Feeds
Meta

Return to page top