Beispiel #1
0
    // Update is called once per frame
    void Update()
    {
        if (first)
        {
            //first = false;
            HScreenDevice.GetInstance().Draw();

            for (int i = 0; i < HScreenDevice.GetInstance().ScreenHeight; i++)
            {
                for (int j = 0; j < HScreenDevice.GetInstance().ScreenWidth; j++)
                {
                    Color color = new Color();
                    color.r = HScreenDevice.GetInstance()
                              .FrameBuff[(i * HScreenDevice.GetInstance().ScreenWidth + j) * 4 + 0] / 255.0f;
                    color.g = HScreenDevice.GetInstance()
                              .FrameBuff[(i * HScreenDevice.GetInstance().ScreenWidth + j) * 4 + 1] / 255.0f;
                    color.b = HScreenDevice.GetInstance()
                              .FrameBuff[(i * HScreenDevice.GetInstance().ScreenWidth + j) * 4 + 2] / 255.0f;
                    color.a = 255 / 255.0f;
                    MainTexture.SetPixel(i, j, color);
                }
            }
            MainTexture.Apply();
            MainImage.sprite = Sprite.Create(MainTexture, new Rect(0, 0, MainTexture.width, MainTexture.height), new Vector2(0.5f, 0.5f));
        }
    }
Beispiel #2
0
 public static HScreenDevice GetInstance()
 {
     if (DeviceInstance == null)
     {
         DeviceInstance = new HScreenDevice();
     }
     return(DeviceInstance);
 }
Beispiel #3
0
    //归一化 且屏幕坐标
    //宽->
    //高↓
    public HVector HomogenizeToScreenCoord(HVector Origin)
    {
        int     ScreenWidth  = HScreenDevice.GetInstance().ScreenWidth;
        int     ScreenHeight = HScreenDevice.GetInstance().ScreenHeight;
        float   rhw          = 1.0f / Origin.w;
        HVector vecRet       = new HVector();

        vecRet.x = (Origin.x * rhw + 1.0f) * ScreenWidth * 0.5f;
        vecRet.y = (1.0f - Origin.y * rhw) * ScreenHeight * 0.5f;
        vecRet.z = Origin.z * rhw;
        vecRet.w = 1.0f;
        return(vecRet);
    }
Beispiel #4
0
    // Use this for initialization
    void Start()
    {
        //获取设备宽高 然后初始化
        int X = 700;
        int Y = 700;

        HScreenDevice.GetInstance().Init(X, Y);

        //MainTexture
        MainTexture = new Texture2D(X, Y, TextureFormat.RGBA32, false);
        //设置绘制一个Cube
        HScreenDevice.GetInstance().shape = new HCube();
    }
Beispiel #5
0
    public void Init()
    {
        int ScreenWidth  = HScreenDevice.GetInstance().ScreenWidth;
        int ScreenHeight = HScreenDevice.GetInstance().ScreenHeight;

        ModleMat = MathHelper.GetIdentityMat();
        HVector camera = new HVector(5, 0, 0, 1);
        HVector at     = new HVector(0, 0, 0, 1);
        HVector up     = new HVector(0, 1, 0, 1);

        ViewMat = MathHelper.GetLookAtMat(
            camera,
            at,
            up
            );
        // fov = 90度 0.5pai
        ProjectionMat = MathHelper.GetPerspectiveMat(3.1415926f * 0.5f, (float)ScreenWidth / (float)ScreenHeight, 1.0f, 500.0f);
        UpdateMVPMat();
    }
Beispiel #6
0
    void DrawScanline(HScanline scanline)
    {
        HScreenDevice ScreenDevice = HScreenDevice.GetInstance();
        List <byte>   framebuffer  = ScreenDevice.FrameBuff;
        List <float>  zbuffer      = ScreenDevice.DepthBuff;

        int x             = (int)scanline.x;
        int y             = (int)scanline.y;
        int scanlineWidth = (int)scanline.width;
        int ScreenWidth   = ScreenDevice.ScreenWidth;
        int ScreenHeight  = ScreenDevice.ScreenHeight;

        for (; scanlineWidth > 0; x++, scanlineWidth--)
        {
            if (x >= 0 && x < ScreenWidth)
            {
                float rhw = scanline.v.rhw;
                if (rhw >= zbuffer[x + y * ScreenWidth])
                {
                    float w = 1.0f / rhw;
                    zbuffer[x + y * ScreenWidth] = rhw;

                    float u      = scanline.v.uv.u * w;
                    float v      = scanline.v.uv.v * w;
                    v2f   fragIn = new v2f();
                    fragIn.uv.u = u;
                    fragIn.uv.v = v;
                    int  color = frag(fragIn);                   //片元着色器
                    byte r = (byte)0x0, g = (byte)0x0, b = (byte)0x0, a = (byte)0x0;
                    MathHelper.GetRGBAFromInt(color, ref r, ref g, ref b, ref a);
                    framebuffer[(x + y * ScreenWidth) * 4]     = r;
                    framebuffer[(x + y * ScreenWidth) * 4 + 1] = g;
                    framebuffer[(x + y * ScreenWidth) * 4 + 2] = b;
                    framebuffer[(x + y * ScreenWidth) * 4 + 3] = a;
                }
            }
            scanline.v = scanline.v.Add(scanline.step);
            if (x >= ScreenWidth)
            {
                break;
            }
        }
    }
Beispiel #7
0
    // 主渲染函数
    void DrawTrap(HTrapezoid trap)
    {
        //HScanline scanline;
        int j, top, bottom;

        top    = (int)(trap.top + 0.5f);
        bottom = (int)(trap.bottom + 0.5f);
        for (j = top; j < bottom; j++)
        {
            if (j >= 0 && j < HScreenDevice.GetInstance().ScreenHeight)              //todo
            //插值得到梯形的腰的两个点
            {
                trap.EdgeInterp((float)j + 0.5f);
                //初始化扫描线
                HScanline scanline = GetScanline(trap, j);
                //绘制扫描线
                DrawScanline(scanline);
            }
        }
    }