Ejemplo n.º 1
0
        public void DrawWater()
        {
            int len;

            ImmediateContext.InputAssembler.SetVertexBuffers(0, new D3D11.VertexBufferBinding(_wavesVB, VertexPN.Stride, 0));
            ImmediateContext.InputAssembler.SetIndexBuffer(_wavesIB, DXGI.Format.R32_UInt, 0);
            var invTranspose = Matrix.Invert(Matrix.Transpose(_wavesWorld));


            for (int p = 0; p < _tech.Description.PassCount; p++)
            {
                ImmediateContext.OutputMerger.BlendState = _alphaBlend;

                _fxClipPlane.Set(new float[] { 0, 0, 0, 1 });
                _fxWVP.SetMatrix(_wavesWorld * _view * _proj);
                _fxUseStructBuf.Set(true);

                _fxWIT.SetMatrix(invTranspose);
                _fxWorld.SetMatrix(_wavesWorld);
                var array = Util.GetArray(_wavesMaterial, out len);
                _fxMaterial.SetRawValue(DataStream.Create <byte>(array, false, false), len);


                _fxReflectViewProj.SetMatrix(_wavesWorld * _reflectView * _proj);

                _fxReflectiveMap.SetResource(reflectResourceView);
                _fxRefractiveMap.SetResource(refractResourceView);
                _fxgRefractionPositionMap.SetResource(positionMapResourceView);
                _fxSolutionSR.SetResource(_awave.CurrentSolutionSRV);

                var pass = _tech.GetPassByIndex(p);

                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(3 * _awave.TriangleCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
                _fxRefractiveMap.SetResource(null);
                _fxReflectiveMap.SetResource(null);
                _fxgRefractionPositionMap.SetResource(null);
                _fxSolutionSR.SetResource(null);
                _fxUseStructBuf.Set(false);
            }
        }