示例#1
0
        // 顶点数据差值
        public static Vertex LerpVertexData(Vertex left, Vertex right, float t)
        {
            Vertex result = new Vertex();

            // 对z值进行插值
            result.pos.Z = MathF.LerpFloat(left.pos.Z, right.pos.Z, t);
            // 对颜色属性进行插值
            result.color = Color01.LerpColor(left.color, right.color, t);
            // 对uv进行插值(此处插值不正确,对于投影变换
            // 需进行 透视插值矫正)
            result.u = MathF.LerpFloat(left.u, right.u, t);
            result.v = MathF.LerpFloat(left.v, right.v, t);

            // 对法线进行插值
            result.normal = Vector3.LerpVector3(left.normal, right.normal, t);

            // 对切线进行插值
            result.tangent = Vector3.LerpVector3(left.tangent, right.tangent, t);

            // MVP矩阵
            result.mMatrix = left.mMatrix;
            result.vMatrix = left.vMatrix;
            result.pMatrix = left.pMatrix;



            return(result);
        }
示例#2
0
        public Vertex(Vector3 pos, Color01 c, float u, float v)
        {
            this.pos   = pos;
            this.color = c;
            this.u     = u;
            this.v     = v;

            // 一并初始化
            this.modelSpacePos = pos;
        }
示例#3
0
        /// <summary>
        /// 根据uv值对一个位图进行采样
        ///
        /// 采用Clamp模式对位图进行采样(即当uv大于1或小于0时,直接进行截断)
        /// </summary>
        /// <param name="texture2D"></param>
        /// <param name="u"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public static Color01 Tex2D(
            Bitmap texture2D,
            float u, float v,
            TextureFilterMode filterMode = TextureFilterMode.Point,
            TextureWrapMode wrapMode     = TextureWrapMode.Clamp)
        {
            // 根据纹理采样模式设置uv
            switch (wrapMode)
            {
            case TextureWrapMode.Clamp:
                // 采用Clamp模式,直接对uv进行截断
                u = MathF.Clamp01(u);
                v = MathF.Clamp01(v);
                break;

            case TextureWrapMode.Repeat:
                // 采用Repeat模式,uv只取小数点部位
                u = MathF.Frac(u);
                v = MathF.Frac(v);
                break;
            }

            Color01 finalColor = Color01.White;

            // 根据纹理过滤模式设置当前uv点的像素颜色
            switch (filterMode)
            {
            case TextureFilterMode.Point:
                // 点采样模式(最近邻采样),
                // 选取距离当前采样点(u,v)最近的纹素作为当前像素的颜色
                int tx = (int)(u * (texture2D.Width - 1));
                int ty = (int)(v * (texture2D.Height - 1));

                tx = MathF.Clamp(tx, 0, texture2D.Width);
                ty = MathF.Clamp(ty, 0, texture2D.Height);

                Color color = texture2D.GetPixel(tx, ty);

                finalColor = Color01.FromColor(color);
                break;

            case TextureFilterMode.Bilinear:
                // 双线性采样
                // (不开启MipMap时,会作用于Level 0(即原始图片大小),
                // 开启后会选择图片大小与3D图形大小最相近的一层)
                // 选取与当前采样区域邻近的四个纹素的均值作为本次采样的结果



                break;
            }

            return(finalColor);
        }
示例#4
0
        /// <summary>
        /// 根据uv值对一个位图进行采样
        ///
        /// 采用Clamp模式对位图进行采样(即当uv大于1或小于0时,直接进行截断)
        /// </summary>
        /// <param name="texture2D"></param>
        /// <param name="u"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public static Color01 Tex2D(Bitmap texture2D, float u, float v)
        {
            // 采用Clamp模式,直接对uv进行截断
            u = MathF.Clamp01(u);
            v = MathF.Clamp01(v);

            int tx = (int)(u * (texture2D.Width - 1));
            int ty = (int)(v * (texture2D.Height - 1));

            tx = MathF.Clamp(tx, 0, texture2D.Width);
            ty = MathF.Clamp(ty, 0, texture2D.Height);

            Color color = texture2D.GetPixel(tx, ty);

            Color01 color01 = Color01.FromColor(color);

            return(color01);
        }