/// <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; }
/// <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; } }