我正在尝试编写一个非常简单的着色器,它可以为适用的对象添加随机闪烁.我想这样做的方法是在像素着色器中为像素值添加一个白色的随机阴影(R = G = B).
它似乎noise()
不像我希望的那样工作:
float multiplier = noise(float3(Input.Position[0], Input.Position[1], time));
Run Code Online (Sandbox Code Playgroud)
它给我"错误X4532:无法将表达式映射到像素着色器指令集",指的是调用noise()
.
由于我不知道在着色器调用之间保留数字的方法,我认为我不能只根据渲染前传入的种子编写一个简单的随机数生成函数.
有没有办法从像素着色器内部生成一个随机数?如果有办法,怎么样?
我对图形编程比较陌生,而且我刚读过一些书籍并且一直在扫描教程,所以请原谅我这是否是一个愚蠢的问题.
我已经掌握了directx11的基础知识,现在我想要玩得开心.所以很自然地我一直在深入阅读着色器管道,我已经着迷了.编写一个简单,微不足道的代码片段的想法必须足够有效,每60秒运行数万次而不浪费资源,这让我急于掌握这个概念,然后再继续并可能弄得一团糟东西的.我遇到的问题是掌握像素着色器实际上在做什么.
顶点着色器很容易理解,您可以在一个统一的数据结构中组织一个对象的顶点,这些数据结构与它的信息相关,比如位置和纹理坐标,然后将每个顶点传递到着色器,通过变换矩阵从3d转换为2d .只要我理解它,我就可以找出如何编码它.
但我没有像素着色器.我得到的是顶点着色器的输出是像素着色器的输入.那么只是将像素着色器交给多边形顶点的2d坐标吗?我所了解的是,像素着色器接收单个像素并对其进行计算以确定颜色和光照等事物.但如果那是真的,那么哪个像素呢?整个屏幕还是只是位于变换的2d多边形内的像素?
或者我完全误解了什么?
高斯,框,径向,方向,运动模糊,变焦模糊等
我读到高斯模糊可以在可以在像素着色器中实现的通道中分解,但是找不到任何样本.
假设任何与自身以外的像素有关的效果都无法在像素着色器中实现,这是正确的吗?
我正在使用OpenGL开发数据可视化工具,LAB颜色空间是我可以处理的数据可视化最容易理解的颜色空间(3轴数据被映射到颜色空间的3个轴).是否存在快速(例如,没有非整数求幂,适合在着色器中执行)算法,用于将LAB值近似转换为RGB值和从RGB值转换?
algorithm colors color-space pixel-shader function-approximation
我正在编写一个代码,以使用桌面复制捕获桌面,并使用英特尔hardwareMFT将其编码为h264。编码器仅接受NV12格式作为输入。我有一个DXGI_FORMAT_B8G8R8A8_UNORM到NV12转换器(https://github.com/NVIDIA/video-sdk-samples/blob/master/nvEncDXGIOutputDuplicationSample/Preproc.cpp)可以正常工作,并且基于DirectX VideoProcessor。
问题是某些英特尔图形硬件上的VideoProcessor仅支持从DXGI_FORMAT_B8G8R8A8_UNORM到YUY2的转换,但不支持NV12的转换,我已经通过GetVideoProcessorOutputFormats枚举支持的格式来确认了相同的转换。尽管VideoProcessor Blt成功实现,没有任何错误,而且我可以看到输出视频中的帧有些像素化,但是如果仔细观察它,我会注意到它。
我猜想,VideoProcessor只是故障转移到了下一个受支持的输出格式(YUY2),而我在不知不觉中将其馈送到认为输入已按照配置在NV12中的编码器。NV12和YUY2之间几乎没有像字节顺序和子采样之类的差异,因此不会出现帧故障或严重损坏的情况。另外,在支持NV12转换的硬件上我也没有像素化问题。
所以我决定使用基于此代码的像素着色器进行颜色转换(https://github.com/bavulapati/DXGICaptureDXColorSpaceConversionIntelEncode/blob/master/DXGICaptureDXColorSpaceConversionIntelEncode/DuplicationManager.cpp)。我能够使像素着色器正常工作,我也已经在这里上传了我的代码(https://codeshare.io/5PJjxP)供参考(尽可能简化了它)。
现在,我剩下两个通道,分别是色度和亮度(ID3D11Texture2D纹理)。对于将两个独立的通道有效地打包到一个ID3D11Texture2D纹理中,以便将其提供给编码器,我确实感到困惑。有没有一种方法可以将Y和UV通道有效地打包到GPU中的单个ID3D11Texture2D中?我非常厌倦基于CPU的方法,因为它价格昂贵,并且无法提供最佳的帧速率。实际上,我什至不愿意将纹理复制到CPU。我正在考虑一种在GPU中执行此操作的方法,而无需在CPU和GPU之间来回复制。
我已经对此进行了相当长时间的研究,没有任何进展,我们将不胜感激。
/**
* This method is incomplete. It's just a template of what I want to achieve.
*/
HRESULT CreateNV12TextureFromLumaAndChromaSurface(ID3D11Texture2D** pOutputTexture)
{
HRESULT hr = S_OK;
try
{
//Copying from GPU to CPU. Bad :(
m_pD3D11DeviceContext->CopyResource(m_CPUAccessibleLuminanceSurf, m_LuminanceSurf);
D3D11_MAPPED_SUBRESOURCE resource;
UINT subresource = D3D11CalcSubresource(0, 0, 0);
HRESULT hr = m_pD3D11DeviceContext->Map(m_CPUAccessibleLuminanceSurf, subresource, D3D11_MAP_READ, 0, &resource);
BYTE* sptr = reinterpret_cast<BYTE*>(resource.pData);
BYTE* dptrY = nullptr; // point to the address of …
Run Code Online (Sandbox Code Playgroud) 如何使用HSLS像素着色器有效地计算图像中所有像素的总和?我对Pixel Shader 2.0很感兴趣,我可以调用它作为WPF着色器效果.
我正在尝试使用C++ directx 11 SDK一次渲染到两个纹理.我希望一个纹理包含结果图像的每个像素的颜色(我在渲染3D场景时通常在屏幕上看到的颜色),另一个纹理包含每个像素和深度的法线(3个浮点数用于法线和1个浮点数)深度).现在,我能想到的是创建两个渲染目标并将第一遍渲染为颜色,第二遍分别传递法线和深度到每个渲染目标.然而,这似乎是浪费时间,因为我可以在第一遍中获得每个像素的颜色,法线和深度的信息.那么有没有办法用像素着色器以某种方式输出两个纹理?
任何帮助,将不胜感激.
PS我在想象像素着色器中的RWTexture2D或RWStructuredBuffer.一点背景:我需要两个图像在计算着色器中进一步处理.这引出了同步的一个侧面问题:由于像素着色器(与计算着色器不同)一次一个地写入每个像素,我如何知道像素着色器何时完成并告诉计算着色器开始图像后处理?
我正在尝试使用像素着色器和两个纹理创建一个tile引擎.一个纹理将保持tileset,一个将保存地图.
是否可以将纹理数据作为实际(非采样)数据读取,以便从地图中提取索引?
读取像素数据的最佳方法是什么?
我只尝试过text2D,但是还有一些不足之处(说实话,我对像素着色器有点新意).
基本上,我需要一种方法来从地图纹理中的特定像素读取实际数据,并将其用作切片纹理的整数索引.假设我已经设法创建并将适当的纹理传递给着色器.
有什么想法吗?
(使用monogame for metro所以dx等级9_1)
我是HLSL的新手.我正在尝试将使用DXGI桌面复制API从BGRA捕获的图像的色彩空间转换为使用纹理作为渲染目标的YUV444.
我已设置像素着色器以执行所需的转换.从渲染目标纹理中取4:2:0子采样YUV并使用ffmpeg将其编码为H264,我可以看到图像.
问题是 - 它是绿色的.
着色器的输入颜色信息是浮点数据类型,但RGB到YUV转换的系数矩阵假定整数颜色信息.
如果我使用钳位功能并将整数从输入颜色中取出,我将失去准确性.
欢迎任何建议和指示.如果有任何其他信息有帮助,请告诉我.
我怀疑我写的Pixel着色器,因为我第一次使用它.这是像素着色器.
float3 rgb_to_yuv(float3 RGB)
{
float y = dot(RGB, float3(0.29900f, -0.16874f, 0.50000f));
float u = dot(RGB, float3(0.58700f, -0.33126f, -0.41869f));
float v = dot(RGB, float3(0.11400f, 0.50000f, -0.08131f));
return float3(y, u, v);
}
float4 PS(PS_INPUT input) : SV_Target
{
float4 rgba, yuva;
rgba = tx.Sample(samLinear, input.Tex);
float3 ctr = float3(0, 0, .5f);
return float4(rgb_to_yuv(rgba.rgb) + ctr, rgba.a);
}
Run Code Online (Sandbox Code Playgroud)
渲染目标映射到CPU可读纹理,并将YUV444数据复制到3个BYTE阵列并提供给ffmpeg libx264编码器.编码器将编码的数据包写入视频文件.
在这里,我考虑每个2X2像素矩阵一个U(Cb)和一个V(Cr)和4个Y值.
我从纹理中检索yuv420数据: …
我想知道在较新的着色器模型中是否支持从目标帧缓冲区读回像素值.我认为这在绘图管道的后期(非可编程)阶段是完成的,这使我希望这个特性可能已被添加到可编程管道中.
我知道可以绘制到纹理绑定的帧缓冲区,然后将此纹理发送到着色器,我只是希望有一种更优雅的方式来实现相同的功能.
pixel-shader ×10
hlsl ×5
directx-11 ×3
glsl ×2
yuv ×2
algorithm ×1
c# ×1
color-space ×1
colors ×1
direct3d11 ×1
directx ×1
directx-9 ×1
gpu ×1
pixels ×1
random ×1
rgba ×1
shader ×1
texture2d ×1
tile-engine ×1
wpf ×1