我刚刚开始在DirectX 11中使用Compute着色器阶段,并且在Compute着色器中写入输出资源时遇到了一些不需要的行为.我似乎只得到零作为输出,据我的理解,这意味着已在Compute着色器中执行了越界读取.(越界写入导致无操作)
输入资源
首先,我创建一个ID3D11Buffer*输入数据.在创建用于输入Compute着色器阶段的SRV时,它将作为资源传递.如果输入数据永远不会改变,那么我们可以ID3D11Buffer*在创建SRV之后释放该对象,因为SRV将充当资源的句柄.
但是,我想每帧更新输入数据,所以我只是将缓冲区留给我处理以进行映射.
// Create a buffer to be bound as Compute Shader input (D3D11_BIND_SHADER_RESOURCE).
D3D11_BUFFER_DESC constantDataDesc;
constantDataDesc.Usage = D3D11_USAGE_DYNAMIC;
constantDataDesc.ByteWidth = sizeof(ParticleConstantData) * NUM_PARTICLES;
constantDataDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
constantDataDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
constantDataDesc.StructureByteStride = sizeof(ParticleConstantData);
constantDataDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
hr = device->CreateBuffer ( &constantDataDesc, 0, &mInputBuffer );
Run Code Online (Sandbox Code Playgroud)
使用新创建的缓冲区作为资源创建SRV
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
srvDesc.BufferEx.FirstElement = 0;
srvDesc.BufferEx.Flags = 0;
srvDesc.BufferEx.NumElements = NUM_PARTICLES;
hr = device->CreateShaderResourceView( mInputBuffer, &srvDesc, &mInputView );
Run Code Online (Sandbox Code Playgroud)
输出资源
现在我需要为Compute着色器创建一个要写入的资源.我还将创建一个系统内存版本的缓冲区来读取.我将使用ID3D11DeviceContext …
我从SO粘贴了一行着色器代码,现在我的项目拒绝工作.
我删除了污染的代码行.
我在Unity论坛上建议使用VS,Notepad和Notepad ++从头开始多次重写着色器.
0xFE 0xFF这个gamedev问题上的建议.我真的无法想出这个.我很感激您的任何建议.
cbuffer CB_PER_FRAME : register(b0)
{
column_major float4x4 view;
column_major float4x4 proj;
float4 eyePosition;
};
struct VertexInput
{
float3 position : POSITION;
float3 normal : NORMAL;
float2 texCoord : TEXCOORD;
row_major float4x4 world : WORLD;
float4 color : COLOR;
uint instanceID : SV_InstanceID;
};
struct PixelInput
{
float4 position : SV_POSITION;
float3 normal : NORMAL;
float2 texCoord : TEXCOORD;
float4 color : COLOR;
};
PixelInput VertexShaderMain( VertexInput …Run Code Online (Sandbox Code Playgroud) 在 SIMD 操作上下文中,非压缩指令和压缩指令有什么区别?
我正在阅读一篇关于优化 SSE 代码的文章:
http://www.cortstratton.org/articles/OptimizingForSSE.php#batch
当我读到这个问题时出现了
“作为额外的好处,movss 是一种非压缩指令,它使我们能够更好地利用并行指令解码器。”
那么区别是什么呢?
MSDN HLSL 参考对 printf 进行了说明:
“向信息队列提交自定义着色器消息。”
https://msdn.microsoft.com/en-us/library/windows/desktop/ff728755%28v=vs.85%29.aspx
什么是信息队列以及如何查看着色器消息?这是否意味着在像素着色器中使用时它会输出宽度*高度(屏幕像素)消息?
谢谢!
许多具有某种相关性质的现有问题似乎发生在 Visual Studio 中,并且是由于错误的项目设置和特别是链接造成的。
我的问题在于实际使用
VS2015的开发人员命令提示符构建 Boost并以管理员身份运行它。
首先,我只是解压缩了文件夹并从根文件夹中运行了 VS2015 命令提示符
bootstrap.bat
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出
C:\Program Files (x86)\boost\boost_1_60_0>bootstrap.bat
Building Boost.Build engine
Failed to build Boost.Build engine.
Please consult bootstrap.log for further diagnostics.
You can try to obtain a prebuilt binary from
http://sf.net/project/showfiles.php?group_id=7586&package_id=72941
Also, you can file an issue at http://svn.boost.org
Please attach bootstrap.log in that case.
Run Code Online (Sandbox Code Playgroud)
根据bootstrap.log没有找到很多必需的头文件。根据Visual C++ 团队博客,标题、源代码和库现在分布在用户计算机上的不同位置。这发生在我身上!为了找到它们,我不得不移动大量的头文件和 lib 文件。
但是......我无法弄清楚如何从这一点开始。