所以我想做的是:
将使用任何算法(在我的情况下为AES-256)加密的文件加载到GPU内存(使用CUDA).
使用我们现在拥有的所有GPU并行功能来解密文件并让它保留在GPU内存中.
现在告诉OpenGL(4.3)内存中的纹理需要从DDS DXT5读取和解压缩.
第3点是我怀疑的地方.由于要在OpenGL中加载压缩的DDS DXT5,必须使用压缩类型(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)和指向图像数据缓冲区的指针调用openGL :: glCompressedTexImage [+ 2D | 3D | 2DARB ...].
所以,简而言之 - >有没有办法将GPU内存中已有的纹理缓冲区地址传递给OpenGL(采用DDS格式)?如果没有此选项,我需要将AES解密文件传输回CPU并告诉OpenGL将其再次加载到GPU中....
非常感谢任何帮助或简短的例子;)
我需要做一个简单的检查,如果一个 dds 文件是有效的格式。我只需要对 dds 文件进行一般检查,所以我不需要检查它是否是 dxt1、dxt5、dx10 等。例如,如果我有一个 png 图像并且我将扩展名重命名为 .dds dds 格式当然会出错,然后我需要告诉用户他正在尝试使用格式错误的 dds 文件。但是,如果我有一个确实具有正确文件格式的 dds,我将不需要做任何进一步的调查,因为我不关心它是什么类型的 dds 文件(此时)。所以我只需要读取 dds 文件的部分,这些部分将在所有 dds 文件上保持不变。我想我可以以某种方式读取 dds 标题和幻数。我必须对 png 文件进行相同的验证,然后我正在读取 png 标题,如下所示:
var png = new byte[] { 0x89, 0x50, 0x4e, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }
using (FileStream fs = new FileStream(fileToCheck, FileMode.Open, FileAccess.Read))
{
if (fs.Length > buffer.Length)
{
fs.Read(buffer, 0, buffer.Length);
fs.Position = (int)fs.Length - endBuffer.Length;
fs.Read(bufferEnd, 0, endBuffer.Length);
}
fs.Close();
}
for (int i = 0; i < png.Length; i++)
{ …Run Code Online (Sandbox Code Playgroud) 如何在C#中将.dds纹理文件加载为图像?我能找到的谷歌没什么用处.
你给我的样本信息越多,我就越能理解它.
好吧,所以我试图权衡使用各种不同纹理压缩技术的专业人士和骗子.我花了99.999%的时间使用DirectX为Windows机器编写2D精灵游戏.
到目前为止,我已经看了纹理打包(SpriteSheets)与alpha修剪,这似乎是获得更多性能的好方法.现在我开始看看它们存储的纹理格式; 目前所有内容都存储为*.PNGs.
我听说*.DDS文件很好,尤其是当与DXT5(/ 3/1取决于任务)压缩一起使用时,因为纹理在VRAM中保持压缩状态?还有人说,因为它们已经是DirectDraw Surfaces,所以它们加载的速度也快得多.
所以我创建了一个应用程序来测试它; 我将该行调用20次以下,在每次调用之间释放纹理.
for (int i = 0; i < 20; i++)
{
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
{
return E_FAIL;
}
g_pTexture->Release();
g_pTexture = NULL;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试使用DXT5纹理,它需要比在简单的*.PNG中加载要长5倍.我听说如果你不生成Mipmap,它会变慢,所以我仔细检查了一下.然后我改变了我用来生成*.DDS文件的程序,切换到NVIDIA自己的nvcompress.exe,但没有任何效果.
编辑:我忘了提到文件(*.png和*.dds)都是相同的图像,只是以不同的格式保存.(相同大小,alpha数量,一切!)
编辑2:当使用以下参数时,它的加载速度提高了近2.5倍,并且消耗的VRAM少了很少!
D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )
Run Code Online (Sandbox Code Playgroud)
但是,我现在正在失去纹理的所有透明度,我看了DXT5纹理,它在Paint.NET和DirectX DDS Viewer中看起来很好.但是当装入所有透明度时变成纯黑色.ColorKey问题?
编辑3:忽略最后一点,我是愚蠢的,在我的"快速示例"中,我忘了在D3DXSprite-> Begin()上启用Alpha-Blending.卫生署!
来自Windows背景,我习惯的唯一压缩文件格式是DDS,它使用S3 DXT压缩.
我不确定iOS设备是否支持DDS,以及可能有哪些其他选项?我听说过爱立信纹理压缩(ETC)和PVRTC之类的东西,但我不明白它们是如何组合在一起的,以及它们对特定硬件功能的依赖程度.
我的代码有什么问题吗?当我执行glCompressedTexImage2D()时程序崩溃(来自Windows XP崩溃消息的东西...)
我试图加载没有mipmap的DDS图像,图像格式是DDS DXT1
我错过了一些包含文件,或者我做错了什么?我从以下网址下载了包含的文件:http: //sourceforge.net/projects/glew/files/glew/1.5.1/glew-1.5.1-win32.zip/download
我在与.exe相同的文件夹中有glew32.dll.
下面的代码只有我更改的部分才能加载DDS图像:
#pragma comment(lib, "glew32.lib")
#include <GL\glew.h>
#include <GL\gl.h>
...
typedef struct {
GLuint dwSize;
GLuint dwFlags;
GLuint dwFourCC;
GLuint dwRGBBitCount;
GLuint dwRBitMask;
GLuint dwGBitMask;
GLuint dwBBitMask;
GLuint dwABitMask;
} DDS_PIXELFORMAT;
typedef struct {
GLuint dwMagic;
GLuint dwSize;
GLuint dwFlags;
GLuint dwHeight;
GLuint dwWidth;
GLuint dwLinearSize;
GLuint dwDepth;
GLuint dwMipMapCount;
GLuint dwReserved1[11];
DDS_PIXELFORMAT ddpf;
GLuint dwCaps;
GLuint dwCaps2;
GLuint dwCaps3;
GLuint dwCaps4;
GLuint dwReserved2;
} DDS_HEADER;
DDS_HEADER DDS_headers;
...
FILE …Run Code Online (Sandbox Code Playgroud) 我正在尝试将纹理转换/压缩为DDS格式,并使用原始PNG进行DXT压缩.我在Mac上,所以我正在使用Graphic Converter(虽然我也尝试过其他工具).但无论我使用哪种DXT级别(DXT1-5),文件大小都与原始PNG大致相同.
我正在创建一个Windows Phone 8应用程序,我正在使用SharpDX来加载纹理.
我试图加载PNG,Content.Load<Texture2D>("filename.png")但我有错误,我已经意识到Windows Phone 8中的SharpDX只接受DDS纹理,不接受PNG/JPEG/BMP等.我已经将我的PNG转换为DDS使用texconv filename.png并将文件添加到我的解决方案就像我在我的项目中使用的其他文件(我可以正确加载).当我运行我的应用程序时,我得到一个例外:
{SharpDX.Serialization.InvalidChunkException: Unexpected chunk [DDS /0x20534444] instead of [TKFX/0x58464B54]
at SharpDX.Serialization.BinarySerializer.BeginChunk(FourCC chunkId)}
好吧,我已经使用该texconv工具将有效的PNG转换为DDS .从我看到的,它是一个文件格式错误,并且fourCC代码对应于DDS,这是应该的.但是SharpDX期望TKFX格式(工具包效应?)而不是DDS.为什么?我试图加载纹理Content.Load<Texture2D>没有Content.Load<Effect>(我也有它加载着色器,它完美地工作).
如果有人发现如何加载PNG而不是DDS,那就更好了!
dds-format ×8
directdraw ×3
textures ×3
c# ×2
c++ ×2
compression ×2
opengl ×2
.net ×1
binaryfiles ×1
directx ×1
encryption ×1
image ×1
ios ×1
pvrtc ×1
sharpdx ×1
texture2d ×1
webgl ×1