locked
請問有關 BasicEffect特效使用 RRS feed

  • 問題

  • 請問一下:

    BasicEffect特效要怎麼讓它透明呢?

     

    我試過用  effect.Alpha = 0.5F; 這樣設定讓它去透明化

    可是出現的結果卻事,直接消失,或者沒有透明。

     

    請問有什麼方法可以讓它透明呢?這問題我找了好久,還是不能解決......

     

    還有模組的透明,我試過去fx檔裡面修改 COLOR.A = 0.5F;

     

    也一樣不能讓該模組透明......

     

    請問有什麼方法可以讓 BasicEffect透明。

    以及有什麼方法可以放 3d模組透明呢?

     

    謝謝!

    2010年10月30日 上午 09:03

解答

  • 我剛剛寫了一篇文章(

    XNA,如何繪製有透明的物件(How to render a transparent object)

    )你可以參考一下,你有fx檔的話,直接在pixel shader最後return color的時候 return float4(r,g,b,0.5f);即可。

    不然堅持要用BasicEffect的話,就先設定一下RenderState的alpha blending

      protected override void Draw(GameTime gameTime)
      {
       GraphicsDevice.Clear(Color.CornflowerBlue);

       // TODO: Add your drawing code here

       device.RenderState.AlphaBlendEnable = true;
       device.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
       device.RenderState.SourceBlend = Blend.SourceAlpha;
       device.RenderState.BlendFunction = BlendFunction.Add;

       DrawModel(myModel, new Vector3(0, 0, 0));

       base.Draw(gameTime);
      }

    GraphicsDevice device;

      protected override void Initialize()
      {
       // TODO: Add your initialization logic here
       device = graphics.GraphicsDevice;

       IsMouseVisible = true;

       CAMERA_POS = CAMERA_REL_POS + POSITION;
       camera_lookat = CAMERA_LOOKAT;
       camera_pos = CAMERA_POS;

       base.Initialize();
      }

    如果需要讓BasicEffect設定物件的透明程度的話,可以加上effect.Alpha = 0.2f;

      private void DrawModel(Model m, Vector3 Position)
      {
       Matrix[] transforms = new Matrix[m.Bones.Count];
       float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;
       m.CopyAbsoluteBoneTransformsTo(transforms);

       Matrix projection =
        Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
        aspectRatio, 1.0f, 10000.0f);

       Matrix view = Matrix.CreateLookAt(camera_pos,
        camera_lookat, Vector3.Up);

       foreach (ModelMesh mesh in m.Meshes)
       {
        foreach (BasicEffect effect in mesh.Effects)
        {
         effect.EnableDefaultLighting();

         effect.Alpha = 0.2f;

         effect.View = view;
         effect.Projection = projection;
         effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);
        }
        mesh.Draw();
       }
      }


    akira32 編程之家 Yahoo http://tw.myblog.yahoo.com/akira32-akira32
    • 已標示為解答 岳耶 2010年10月30日 下午 01:12
    2010年10月30日 下午 12:03

所有回覆

  • 我剛剛寫了一篇文章(

    XNA,如何繪製有透明的物件(How to render a transparent object)

    )你可以參考一下,你有fx檔的話,直接在pixel shader最後return color的時候 return float4(r,g,b,0.5f);即可。

    不然堅持要用BasicEffect的話,就先設定一下RenderState的alpha blending

      protected override void Draw(GameTime gameTime)
      {
       GraphicsDevice.Clear(Color.CornflowerBlue);

       // TODO: Add your drawing code here

       device.RenderState.AlphaBlendEnable = true;
       device.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
       device.RenderState.SourceBlend = Blend.SourceAlpha;
       device.RenderState.BlendFunction = BlendFunction.Add;

       DrawModel(myModel, new Vector3(0, 0, 0));

       base.Draw(gameTime);
      }

    GraphicsDevice device;

      protected override void Initialize()
      {
       // TODO: Add your initialization logic here
       device = graphics.GraphicsDevice;

       IsMouseVisible = true;

       CAMERA_POS = CAMERA_REL_POS + POSITION;
       camera_lookat = CAMERA_LOOKAT;
       camera_pos = CAMERA_POS;

       base.Initialize();
      }

    如果需要讓BasicEffect設定物件的透明程度的話,可以加上effect.Alpha = 0.2f;

      private void DrawModel(Model m, Vector3 Position)
      {
       Matrix[] transforms = new Matrix[m.Bones.Count];
       float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;
       m.CopyAbsoluteBoneTransformsTo(transforms);

       Matrix projection =
        Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
        aspectRatio, 1.0f, 10000.0f);

       Matrix view = Matrix.CreateLookAt(camera_pos,
        camera_lookat, Vector3.Up);

       foreach (ModelMesh mesh in m.Meshes)
       {
        foreach (BasicEffect effect in mesh.Effects)
        {
         effect.EnableDefaultLighting();

         effect.Alpha = 0.2f;

         effect.View = view;
         effect.Projection = projection;
         effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);
        }
        mesh.Draw();
       }
      }


    akira32 編程之家 Yahoo http://tw.myblog.yahoo.com/akira32-akira32
    • 已標示為解答 岳耶 2010年10月30日 下午 01:12
    2010年10月30日 下午 12:03
  • 請問:

    如果是.FBX檔,是否就不行了呢?

    我有下載大大的範例,執行是有透明的,但是換上.FBX檔之後就不能了。

    是不是因為.FBX檔將材質都包在檔案裡面,所以無法透明化呢?

     

    2010年10月30日 下午 01:24
  • 我都是用XFile,FBX的材質應該也是在輸出的時候放在與FBX同一個資料夾,如果不用BasicEffect.Alpha的話,你的材質要有透明,我習慣都用png檔,我的範例有附psd檔,你可以用photoshop看一下。


    akira32 編程之家 Yahoo http://tw.myblog.yahoo.com/akira32-akira32
    2010年10月31日 下午 12:21