我目前正在编写一个HLSL用于基本高斯模糊的着色器。着色器代码很简单,但我不断收到错误:
不在 dx9 兼容模式下时,DX9 风格特性将被禁用。(法律公告#:19)
这告诉我,我的代码中的第 19 行是问题所在,我相信它要么是由于该特定行引起的tex2D,要么是Sampler在该特定行中。
#include "Common.hlsl"
Texture2D Texture0 : register(t0);
SamplerState Sampler : register(s0);
float4 PSMain(PixelShaderInput pixel) : SV_Target {
float2 uv = pixel.TextureUV; // This is TEXCOORD0.
float4 result = 0.0f;
float offsets[21] = { ... };
float weights[21] = { ... };
// Blur horizontally.
for (int x = 0; x < 21; x++)
result += tex2D(Sampler, float2(uv.x + offsets[x], uv.y)) * weights[x];
return result;
}
Run Code Online (Sandbox Code Playgroud)
请参阅下面有关代码的注释和我的问题。
假设我想使用计算着色器来运行 Kernel_X,线程尺寸为 (8, 1, 1)。
我可以将其设置为:
在脚本中:
Shader.Dispatch(Kernel_X, 8, 1, 1);
Run Code Online (Sandbox Code Playgroud)
在着色器中:
[numthreads(1,1,1)]
void Kernel_X(uint id : SV_DispatchThreadID) { ... }
Run Code Online (Sandbox Code Playgroud)
或者我可以这样设置:
在脚本中:
Shader.Dispatch(Kernel_X, 1, 1, 1);
Run Code Online (Sandbox Code Playgroud)
在着色器中:
[numthreads(8,1,1)]
void Kernel_X(uint id : SV_DispatchThreadID) { ... }
Run Code Online (Sandbox Code Playgroud)
据我所知,在这段代码的末尾,维度将是 (8, 1, 1); 然而,我想知道交换数字实际上有何不同。我的猜测是,运行 Dispatch (Kernel_X, 8, 1, 1) 会“运行”1x1x1 内核 8 次,而运行 numthreads(8,1,1) 将运行 8x1x1 内核一次。
我目前有一个延迟渲染系统设置,可以渲染点光源和方向灯.我的问题是我可以选择不同形式的阴影,它可以根据点光源和定向光源制作阴影,可以使用延迟着色设置?
我想写一个带有输入图像的像素着色器,并将一个Hue范围(即HSV)的所有颜色转换为另一个Hue范围.
我的动机很简单:我想以不同的方式为一堆不同的纹理着色,但我不想为整个纹理着色,只是在特定范围内具有色调的部分.这样,我可以绘制一辆赛车的图像,然后使用像素着色器更改汽车上的条纹和徽标的颜色.
我在网上查看了HLSL文档,找不到任何处理色调的内容.是否有在线提供的HLSL代码库?
这是我想要完成的一些伪代码:
external float SrcMinHue,SrcMaxHue,TargetMin
void changeHues(image source)
{
foreach x,y in image:
{
float sourceHue = getHue(source,x,y)
if (SrcMinHue < sourceHue < SrcNaxHue):
setHue(source,x,y,(TargetMin + (sourceHue - MinHue))
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用XNA Game Studio,如果这些信息对任何人都很重要.
有了XNA背景,我尝试创建一个简单的DirectX11应用程序.现在我试着弄清楚如何设置着色器常量,例如投影矩阵等.我正在阅读有关常量缓冲区的信息 - 但是在渲染之前没有简单的方法来设置一些常量,而不使用缓冲区?
假设我有一个带有常量缓冲区的HLSL顶点着色器片段:
cbuffer matrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
cbuffer matrixBuffer2
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};
Run Code Online (Sandbox Code Playgroud)
来自常量缓冲区的变量然后用于acctual vs function,所以我需要设置它们.
在C++中,我声明了以下结构:
struct MatrixType
{
D3DMATRIX world;
D3DXMATRIX view;
D3DXMATRIX projection;
};
Run Code Online (Sandbox Code Playgroud)
在我初学者的应用程序中,我创建了常量缓冲区指针ID3D11Buffer*.
稍后在每帧方法我更新常量缓冲区,即i映射缓冲区,更新子资源,unmap缓冲区和顶点着色器中的设置缓冲区.
当我只有一个常量缓冲区时,一切都很好,但这是我的问题.
directx如何在缓冲区之间进行区分?例如我想设置worldMatrix2如何实现这一目标?
我读了msdn参考但我没有回答.
是否允许具有两个或更多具有相同大小和元素的常量缓冲区?它们是否存储在连续的内存中,所以当我设置缓冲区时,它们是按HLSL声明的顺序设置的?
如果在使用HLSL或其他高级着色器语言将数据发送到GPU时,如果有一个单独的缓冲区,我对代码设计和性能方面感兴趣.
这是特定着色器需要具有大量可变数据的地方,这些数据在运行时期间会发生变化,因此需要通过缓冲区传递信息.
我举一个非常基本的例子:
cbuffer SomeLargeBuffer : register(cb0)
{
float3 data;
float someData;
float4 largeArray[2500];
float moreData;
...
...
...
...
...
}
Run Code Online (Sandbox Code Playgroud)
或者拥有
cbuffer SamllerBuffer: register(cb0)
{
float3 data;
float someRelatedData;
}
cbuffer SecondSmallerBuffer : register(cb1)
{
float4 largeArray[2500];
float moreData;
}
cbuffer ThirdBuffer: register(cb2)
{
...
...
...
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio,C#,XAML,WPF.
在我的程序中,我有带有白色png图标的XAML按钮.
我想拥有它,所以你可以通过从ComboBox中选择主题来切换到带有黑色图标的主题.
不是创建一组新的黑色png图像,有没有办法使用XAML和C#我可以反转白色图标的颜色?
<Button x:Name="btnInfo" HorizontalAlignment="Left" Margin="10,233,0,0" VerticalAlignment="Top" Width="22" Height="22" Cursor="Hand" Click="buttonInfo_Click" Style="{DynamicResource ButtonSmall}">
<Image Source="Resources/Images/info.png" Width="5" Height="10" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="1,0,0,0"/>
</Button>
Run Code Online (Sandbox Code Playgroud) 我正在学习DirectX 11的HLSL,我想知道SV_POSITION是什么,它是Vertex Shader的输出,还是Pixel Shader的输入。
1:是屏幕上每个像素或对象的x,y,z?
2:为什么有4个32位浮点数?
3:顶点输出需要这个系统变量吗?
谢谢!