// 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)); } }
public static HScreenDevice GetInstance() { if (DeviceInstance == null) { DeviceInstance = new HScreenDevice(); } return(DeviceInstance); }
//归一化 且屏幕坐标 //宽-> //高↓ 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); }
// 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(); }
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(); }
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; } } }
// 主渲染函数 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); } } }