- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前有一个问题,即库创建了 BGRA 像素格式的 DX11 纹理。
但是显示库只能正确显示RGBA。 (这意味着颜色在渲染图像中交换)
环顾四周后,我发现了一个简单的 for 循环来解决问题,但性能不是很好,并且在更高的分辨率下扩展性很差。我是 DirectX 的新手,也许我只是错过了一个简单的功能来进行转换。
// Get the image data
unsigned char* pDest = view->image->getPixels();
// Prepare source texture
ID3D11Texture2D* pTexture = static_cast<ID3D11Texture2D*>( tex );
// Get context
ID3D11DeviceContext* pContext = NULL;
dxDevice11->GetImmediateContext(&pContext);
// Copy data, fast operation
pContext->CopySubresourceRegion(texStaging, 0, 0, 0, 0, tex, 0, nullptr);
// Create mapping
D3D11_MAPPED_SUBRESOURCE mapped;
HRESULT hr = pContext->Map( texStaging, 0, D3D11_MAP_READ, 0, &mapped );
if ( FAILED( hr ) )
{
return;
}
// Calculate size
const size_t size = _width * _height * 4;
// Access pixel data
unsigned char* pSrc = static_cast<unsigned char*>( mapped.pData );
// Offsets
int offsetSrc = 0;
int offsetDst = 0;
int rowOffset = mapped.RowPitch % _width;
// Loop through it, BRGA to RGBA conversation
for (int row = 0; row < _height; ++row)
{
for (int col = 0; col < _width; ++col)
{
pDest[offsetDst] = pSrc[offsetSrc+2];
pDest[offsetDst+1] = pSrc[offsetSrc+1];
pDest[offsetDst+2] = pSrc[offsetSrc];
pDest[offsetDst+3] = pSrc[offsetSrc+3];
offsetSrc += 4;
offsetDst += 4;
}
// Adjuste offset
offsetSrc += rowOffset;
}
// Unmap texture
pContext->Unmap( texStaging, 0 );
Texture2D txDiffuse : register(t0);
SamplerState texSampler : register(s0);
struct VSScreenQuadOutput
{
float4 Position : SV_POSITION;
float2 TexCoords0 : TEXCOORD0;
};
float4 PSMain(VSScreenQuadOutput input) : SV_Target
{
return txDiffuse.Sample(texSampler, input.TexCoords0).rgba;
}
最佳答案
显然,在 CPU 上迭代纹理并不是最有效的方法。如果您知道纹理中的颜色总是像这样交换,并且您不想在 C++ 代码中修改纹理本身,那么最直接的方法是在像素着色器中进行。当您对纹理进行采样时,只需在那里交换颜色。您甚至不会注意到任何性能下降。
关于directx-11 - DX11 将像素格式 BGRA 转换为 RGBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24148164/
Closed. This question needs details or clarity。它当前不接受答案。
所以,我在用 C++ 和 DirectX 11 开发游戏引擎,我注意到人们通常使用 BGRA 而不是 RGBA 作为 SwapChain 格式。人们为什么那样做?为什么是 32 位颜色而不是 256
所以,我在用 C++ 和 DirectX 11 开发游戏引擎,我注意到人们通常使用 BGRA 而不是 RGBA 作为 SwapChain 格式。人们为什么那样做?为什么是 32 位颜色而不是 256
我有一个缓冲区,其中包含一个“原始”BGRA 纹理,每种颜色一个字节。线条顺序相反(纹理颠倒)。 BGRA 缓冲区全是绿色 (0, 255, 0, 255)。 我需要将其转换为 RGBA 并翻转纹理线
我正在阅读 this tutorial关于从 iPhone 相机获取像素数据。 虽然运行和使用此代码没有问题,但我需要获取相机数据的输出(来自 BGRA)并将其转换为 ARGB,以便我可以将其与外部库
下午好! 在DirectX中我是初学者,很多东西我都不知道。 我在视频卡的内存中有一个 RGBA 格式的纹理 (DXGI_FORMAT_R8G8B8A8_UNORM)。这是截获的游戏缓冲区。在将其内容
我有一个 BGRA 数组,需要将其绘制到 Canvas 上。 目前我正在这样做: var aVal = returnedFromChromeWorker; var can = doc.createEl
我的目的是录屏。我正在使用 Windows DXGI API 接收屏幕截图,并使用 libx264 将屏幕截图编码为视频。将 BGRA 图像直接馈送到 libx264 会在输出视频中产生奇怪的颜色。因
有人可以解释以下三个函数之间的区别吗? typedef union { std::uint8_t B, G, R, A; std::uint32_t Colour; } BGRA; 第
我想使用 GPUImage 框架捕获原始像素数据进行操作。我这样捕获数据: CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(i
我将 BGRA 图像转储为以下格式(连续)的二进制文件:[(b, g, r, a), (b, g, r, a), (b, g, r, a ) ...]我知道图像的宽度、高度和 channel 数量(在
我想用iphone的相机拍一张原始图像数据,然后在笔记本电脑上用matlab或opencv进行后处理。所以我需要把这个原始图像数据从 iphone 带到笔记本电脑上。 目前,我使用 AVFoudnat
所以,我对刚刚运行的快速测试感到非常困惑。我正在用 C# 做一些图像处理。 Get/SetPixel() 已被证明太慢,所以我使用 LockBits 来获取原始数据。 但是,我似乎遇到了一个我无法弄清
在跟进之前关于将 RGB 转换为 RGBA 以及 ARGB 转换为 BGR 的一些问题后,我想使用 SSE 加快 RGB 到 BGRA 的转换.假设一台 32 位机器,并且想使用 intrinsics
在跟进之前关于将 RGB 转换为 RGBA 以及 ARGB 转换为 BGR 的一些问题后,我想使用 SSE 加快 RGB 到 BGRA 的转换.假设一台 32 位机器,并且想使用 intrinsics
我目前有一个问题,即库创建了 BGRA 像素格式的 DX11 纹理。 但是显示库只能正确显示RGBA。 (这意味着颜色在渲染图像中交换) 环顾四周后,我发现了一个简单的 for 循环来解决问题,但性能
我正在使用原始相机帧在 opengl 中进行一些视频处理。我告诉相机给我 BGRA,因为我听说这在 iPhone 上性能更高。现在,我知道原生相机格式是 YUV,但为了处理我正在做红绿蓝。 整个 BG
我正在使用 Metal 开发一个 iOS 应用程序,并且可以选择使用 RGBA 或 BGRA 作为纹理格式。该应用程序将是: 渲染成纹理 在屏幕上绘制纹理 从纹理生成UIImages 从UIImage
我有一个包含 BGRA 栅格数据的 byte[] 数组(例如,第一个字节 = 蓝色分量,第二个 = 绿色,第五个 = 下一个像素,蓝色),并且想使用它。 具体来说,是否有一个 Java 类已经被设计来
我正在开展一个项目,我使用 AVCaptureSession 捕获用户的视频输入。问题是我需要 BGRA 格式的输出以使用 OpenCV 渲染它,但随后我需要将其更改回默认的 420f 格式以将其显示
我是一名优秀的程序员,十分优秀!