在DXGI_FORMAT的官方文档中,告诉我们只有带有_SRGB枚举后缀的格式才属于sRGB色彩空间。我认为没有这个后缀的其他格式都在线性空间中。但是我在 DirectXTex 库中发现了格式转换函数的一个很奇怪的行为。(您可以从http://directxtex.codeplex.com/下载)
首先,我使用NVIDIA Photoshop DDS Plugin将纹理文件导出为DXGI_FORMAT_R32G32B32A32_FLOAT。然后我通过 LoadFromDDSFile() 函数加载这个文件,并通过 Convert() 函数将其格式转换为 DXGI_FORMAT_R16G16B16A16_UNORM。(这两个函数都是由 DirectXTex 库提供的。)
你猜怎么着?图像转换为DXGI_FORMAT_R16G16B16A16_UNORM后,所有像素的亮度也发生了变化,整个图像变得比以前更亮了。
如果在图像转换为 DXGI_FORMAT_R16G16B16A16_UNORM 格式后手动将像素值从 sRGB 空间转换为线性空间,则生成的像素值与输入相同。因此,我假设 DirectXTex 库将 DXGI_FORMAT_R32G32B32A32_FLOAT 视为线性色彩空间中的格式,并将 DXGI_FORMAT_R16G16B16A16_UNORM 视为 sRGB 色彩空间中的格式,然后将色彩空间从线性空间转换为 sRGB 空间。(我试图找出为什么Convert()函数也会转换颜色空间,但它是由WIC实现的,并且没有它的源代码。)
那么,DirectXTex 库中是否有任何错误?或者它是 DXGI_FORMAT 的真正标准?如果某些特殊的 DXGI_FORMAT 有不同的颜色空间,请告诉我在哪里可以找到它的规范。
任何帮助将不胜感激。谢谢!
我发现在用于进行数学计算的一些SSE优化代码中,它们使用movlps和movhps指令的组合而不是单个movups指令来传输未对齐的数据.我不知道为什么,所以我自己尝试了,这是下面的伪代码:
struct Vec4
{
float f[4];
};
const size_t nSize = sizeof(Vec4) * 100;
Vec4* pA = (Vec4*)malloc( nSize );
Vec4* pB = (Vec4*)malloc( nSize );
Vec4* pR = (Vec4*)malloc( nSize );
...Some data initialization code here
...Records current time by QueryPerformanceCounter()
for( int i=0; i<100000, ++i )
{
for( int j=0; j<100; ++j )
{
Vec4* a = &pA[i];
Vec4* b = &pB[i];
Vec4* r = &pR[i];
__asm
{
mov eax, a
mov ecx, b
mov edx, r
...option …Run Code Online (Sandbox Code Playgroud) 例如,在批处理文件中,我输入以下命令:
xcopy C:\ fileA.txt D:\ Dir\/ y/d
如果没有名为fileA.txt的文件,它将绝对失败.但我想知道它是否失败,然后向用户输出一些消息.我怎样才能做到这一点?
任何帮助将不胜感激,谢谢!
assembly ×1
batch-file ×1
color-space ×1
direct3d ×1
dxgi ×1
game-engine ×1
graphics ×1
optimization ×1
sse ×1
windows ×1