Example #1
0
    private void OnPostRender()
    {
        Camera cam = Camera.current;

        // rt设置为当前的渲染目标
        Graphics.SetRenderTarget(rt);

        // 将手动创建的rt执行clear操作,使其变成一个白色的贴图
        GL.Clear(true, true, Color.white);

        // start drawcall
        pureColorMaterial.color = new Color(0, 0.5f, 0.8f);
        pureColorMaterial.SetPass(0);

        // 使用同一个材质,绘制多个模型
        foreach (Transform transform in cubeTransforms)
        {
            Graphics.DrawMeshNow(cubeMesh, transform.localToWorldMatrix);
        }

        // end drawcall

        skyboxDraw.DrawSkybox(cam, rt.colorBuffer, depthTexture.depthBuffer);

        // 将rt绘制到cam.targetTexture,cam.targetTexture如果为null,则绘制到屏幕上
        Graphics.Blit(rt, cam.targetTexture);
    }
    private void OnPostRender()
    {
        Camera cam = Camera.current;

        if (screenHeight != cam.pixelHeight * superSample || screenWidth != cam.pixelWidth * superSample)
        {
            screenHeight = (int)(cam.pixelHeight * superSample);
            screenWidth  = (int)(cam.pixelWidth * superSample);
            ReSize(cameraTarget, screenWidth, screenHeight);
            ReSize(depthTexture, screenWidth, screenHeight);
            foreach (var i in GBufferTextures)
            {
                ReSize(i, screenWidth, screenHeight);
            }
            for (int i = 0; i < GBuffers.Length; ++i)
            {
                GBuffers[i] = GBufferTextures[i].colorBuffer;
            }
        }
        Shader.SetGlobalTexture(_DepthTexture, depthTexture);
        Matrix4x4 proj  = GL.GetGPUProjectionMatrix(cam.projectionMatrix, false);
        Matrix4x4 vp    = proj * cam.worldToCameraMatrix;
        Matrix4x4 invvp = vp.inverse;

        Shader.SetGlobalMatrix(_InvVP, invvp);
        CullMesh.UpdateFrame(cam, ref invvp, transform.position);
        SortMesh.UpdateFrame();
        JobHandle cullhandle = CullMesh.Schedule();
        JobHandle sortHandle = SortMesh.Schedule(cullhandle);

        JobHandle.ScheduleBatchedJobs();
        for (int i = 0; i < gbufferIDs.Length; ++i)
        {
            Shader.SetGlobalTexture(gbufferIDs[i], GBufferTextures[i]);
        }
        Graphics.SetRenderTarget(GBuffers, depthTexture.depthBuffer);
        GL.Clear(true, true, Color.black);
        //Start Draw Mesh
        deferredMaterial.SetPass(0);
        sortHandle.Complete();
        for (int i = 0; i < SortMesh.sorts.Length; ++i)
        {
            DrawElements(ref SortMesh.sorts[i]);
        }
        lighting.DrawLight(GBufferTextures, gbufferIDs, cameraTarget, cam);
        //End Deferred Lighting
        skyDraw.DrawSkybox(cam, cameraTarget.colorBuffer, depthTexture.depthBuffer);
        Graphics.Blit(cameraTarget, cam.targetTexture);
    }