Exemple #1
0
        /// <summary>
        /// ポインタから
        /// </summary>
        /// <param name="ptr"></param>
        public TextureBuffer(IntPtr ptr)
        {
            ksTexHeader header = (ksTexHeader)Marshal.PtrToStructure(ptr, typeof(ksTexHeader));
            int         offset = Marshal.SizeOf(header);

            ptr += offset;

            // データをバイト配列にコピー
            byte[] buffer = new byte[header.data_size];
            Marshal.Copy(ptr, buffer, 0, header.data_size);

            // バッファから初期化
            shaderResourceView_ = ShaderResourceView.FromMemory(GraphicsCore.D3D11Device, buffer);
            buffer_             = shaderResourceView_.Resource;

            // 情報取得
            var tex = (Texture2D)shaderResourceView_.Resource;

            width_  = tex.Description.Width;
            height_ = tex.Description.Height;
            format_ = tex.Description.Format;
            mips_   = tex.Description.MipLevels;
        }
Exemple #2
0
        /// <summary>
        /// ファイルから
        /// </summary>
        /// <param name="file_name"></param>
        public TextureBuffer(string file_name)
        {
            using (var stream = new System.IO.FileStream(file_name, System.IO.FileMode.Open, FileAccess.Read)) {
                byte[] data = new byte[stream.Length];
                stream.Read(data, 0, (int)stream.Length);
                MemoryStream s = new MemoryStream(data);

                // 名前からDDSかを判別
                string ext = Path.GetExtension(file_name).ToLower();
                if (ext == ".kstex")
                {
                    // ksTex
                    // byte配列からポインタを取得
                    var         handle = GCHandle.Alloc(data, GCHandleType.Pinned);
                    IntPtr      ptr    = handle.AddrOfPinnedObject();
                    ksTexHeader header = (ksTexHeader)Marshal.PtrToStructure(ptr, typeof(ksTexHeader));
                    int         offset = Marshal.SizeOf(header);

                    // ストリームの一をセットしてSRV生成
                    s.Position          = offset;
                    shaderResourceView_ = ShaderResourceView.FromStream(GraphicsCore.D3D11Device, s, header.data_size);
                    handle.Free();
                }
                else if (ext == ".tga")
                {
                    // tga
                    var       handle     = GCHandle.Alloc(data, GCHandleType.Pinned);
                    IntPtr    ptr        = handle.AddrOfPinnedObject();
                    tgaHeader header     = (tgaHeader)Marshal.PtrToStructure(ptr, typeof(tgaHeader));
                    int       offset     = Marshal.SizeOf(header);
                    int       image_size = header.width * header.height * 4;                    // 32bit固定
                    byte[]    image_buf  = new byte[image_size];
                    // 上下反転
                    int w            = header.width;
                    int h            = header.height;
                    int dst_row_size = w * 4;
                    int bpp          = header.depth / 8;
                    int src_row_size = w * bpp;
                    Func <int, int, int> getAddrFunc;
                    if ((header.flag & (1 << 5)) == 0)
                    {
                        getAddrFunc = (height, current_heght) => {
                            return((height - 1 - current_heght) * dst_row_size);
                        };
                    }
                    else
                    {
                        getAddrFunc = (height, current_heght) => {
                            return(current_heght * dst_row_size);
                        };
                    }
                    for (int ch = 0; ch < h; ch++)
                    {
                        int src_start = src_row_size * ch + offset;
                        int dst_start = getAddrFunc(h, ch);
                        for (int cw = 0; cw < w; cw++)
                        {
                            int src = src_start + cw * bpp;
                            int dst = dst_start + cw * 4;
                            image_buf[dst + 0] = data[src + 0];
                            image_buf[dst + 1] = data[src + 1];
                            image_buf[dst + 2] = data[src + 2];
                            image_buf[dst + 3] = (bpp == 4) ? data[src + 3] : (byte)255;
                        }
                    }
                    byte[][][] data_ary = new byte[][][] {
                        new byte[][] {
                            image_buf,
                        },
                    };
                    BufferDesc desc = new BufferDesc()
                    {
                        width    = header.width,
                        height   = header.height,
                        format   = Format.B8G8R8A8_UNorm,
                        initData = data_ary,
                        mips     = 0,
                    };
                    Initialize(desc);
                    handle.Free();
                }
                else
                {
                    // その他フォーマット
                    shaderResourceView_ = ShaderResourceView.FromStream(GraphicsCore.D3D11Device, s, (int)stream.Length);
                }

                // 情報取得
                if (shaderResourceView_.Resource is Texture2D)
                {
                    var tex = (Texture2D)shaderResourceView_.Resource;
                    width_  = tex.Description.Width;
                    height_ = tex.Description.Height;
                    format_ = tex.Description.Format;
                    mips_   = tex.Description.MipLevels;
                }
                else if (shaderResourceView_.Resource is Texture3D)
                {
                    var tex = (Texture3D)shaderResourceView_.Resource;
                    width_  = tex.Description.Width;
                    height_ = tex.Description.Height;
                    format_ = tex.Description.Format;
                    mips_   = tex.Description.MipLevels;
                }

                buffer_ = shaderResourceView_.Resource;
            }
        }