Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 如何实施";“渲染到纹理”;Direct3D 11中的管道?_Directx_Direct3d_Hlsl - Fatal编程技术网

Directx 如何实施";“渲染到纹理”;Direct3D 11中的管道?

Directx 如何实施";“渲染到纹理”;Direct3D 11中的管道?,directx,direct3d,hlsl,Directx,Direct3d,Hlsl,我正在尝试使用HLSL和Direct3D 11进行一些GPGPU计算。 我的目标是按顺序计算几个图像(每个图像一次渲染),然后求和 为了实现这一点,我创建了三个纹理:一个是输入,两个用于总结结果。我尝试的方法是:首先渲染到texture2(我使用纹理和texture3纹理作为输入),然后使用稍微修改的像素着色器渲染到texture3(我使用纹理和texture2纹理作为输入)。之后,我将纹理转储到PNG文件中。我的问题是,不知何故,第二个像素着色器没有得到第一个着色器(texture2)的结果,

我正在尝试使用HLSL和Direct3D 11进行一些GPGPU计算。 我的目标是按顺序计算几个图像(每个图像一次渲染),然后求和

为了实现这一点,我创建了三个纹理:一个是输入,两个用于总结结果。我尝试的方法是:首先渲染到texture2(我使用纹理和texture3纹理作为输入),然后使用稍微修改的像素着色器渲染到texture3(我使用纹理和texture2纹理作为输入)。之后,我将纹理转储到PNG文件中。我的问题是,不知何故,第二个像素着色器没有得到第一个着色器(texture2)的结果,而是原始的空纹理。我使用用法D3D11_用法(默认值)和D3D11_绑定(渲染)目标| D3D11_绑定(着色器)资源绑定标志定义了纹理、纹理2和纹理3

我的HLSL着色器(着色器1):

另一个着色器(着色器2):

执行渲染和纹理转储的代码:

context->OMSetRenderTargets(1, &targetViewTexture2, NULL);

float z = 280.0F;
GenMatrix(z);
context->VSSetShader(vs, NULL, 0);
context->PSSetShader(ps, NULL, 0);
context->PSSetSamplers(0, 1, &state);
context->VSSetConstantBuffers(0, 1, &cbuf);
context->Draw(6, 0);
swapChain->Present(0, 0);

context->OMSetRenderTargets(1, &targetViewTexture3, NULL);
z = 0.0F;
GenMatrix(z);
context->VSSetShader(vs, NULL, 0);
context->PSSetShader(ps2, NULL, 0);
context->PSSetSamplers(0, 1, &state);
context->VSSetConstantBuffers(0, 1, &cbuf);
context->Draw(6, 0);
swapChain->Present(0, 0);
DirectX::ScratchImage im;
DirectX::CaptureTexture(device, context, texture3, im);
const DirectX::Image *realImage = im.GetImage(0, 0, 0);
HRESULT hr2 = DirectX::SaveToWICFile(*realImage, DirectX::WIC_FLAGS_NONE, GUID_ContainerFormatPng, L"output_tex3.png", NULL);
DirectX::CaptureTexture(device, context, texture2, im);
realImage = im.GetImage(0, 0, 0);
hr2 = DirectX::SaveToWICFile(*realImage, DirectX::WIC_FLAGS_NONE, GUID_ContainerFormatPng, L"output_tex2.png", NULL);
第一个过程(ps)的输出正确,但第二个过程不正确。如果我只保留着色器代码:

    float4 val5 = tex2.Sample(sam, input.Tex4);

我得到一个空的图像。我错过什么了吗?我是否必须调用一些方法来使用第二个像素着色器中的纹理?我想我已经指出了我的大型代码库的相关部分,但是如果您需要更多信息,只需在注释部分询问即可。

问题在于我使用纹理作为输入和输出。您可以在一次过程中使用纹理作为输入或渲染目标。

问题是我将纹理同时用作输入和输出。您可以一次使用纹理作为输入或渲染目标。

是否使用Visual Studio 2012?因为它有非常强大的图形调试工具。为什么你的代码中有一个
swapChain->Present
?我以前有swapChain->Present,因为我使用屏幕查看每个步骤的结果(我现在已经注释掉了)。我使用VS2012,但我不知道如何开始;由于纹理在第一次绘制调用后似乎已填充,但在第二次绘制调用中似乎为空。是否尝试使用Visual Studio 2012图形调试工具?在Debug->Graphics->Start Diagnostics中,我得到了一个有趣的结果:使用您提到的调试工具,我查看了输入纹理,它实际上不是空的,而是包含正确的值。由于其他问题,输出可能不正确。是否使用Visual Studio 2012?因为它有非常强大的图形调试工具。为什么你的代码中有一个
swapChain->Present
?我以前有swapChain->Present,因为我使用屏幕查看每个步骤的结果(我现在已经注释掉了)。我使用VS2012,但我不知道如何开始;由于纹理在第一次绘制调用后似乎已填充,但在第二次绘制调用中似乎为空。是否尝试使用Visual Studio 2012图形调试工具?在Debug->Graphics->Start Diagnostics中,我得到了一个有趣的结果:使用您提到的调试工具,我查看了输入纹理,它实际上不是空的,而是包含正确的值。由于其他问题,输出可能不正确。
context->OMSetRenderTargets(1, &targetViewTexture2, NULL);

float z = 280.0F;
GenMatrix(z);
context->VSSetShader(vs, NULL, 0);
context->PSSetShader(ps, NULL, 0);
context->PSSetSamplers(0, 1, &state);
context->VSSetConstantBuffers(0, 1, &cbuf);
context->Draw(6, 0);
swapChain->Present(0, 0);

context->OMSetRenderTargets(1, &targetViewTexture3, NULL);
z = 0.0F;
GenMatrix(z);
context->VSSetShader(vs, NULL, 0);
context->PSSetShader(ps2, NULL, 0);
context->PSSetSamplers(0, 1, &state);
context->VSSetConstantBuffers(0, 1, &cbuf);
context->Draw(6, 0);
swapChain->Present(0, 0);
DirectX::ScratchImage im;
DirectX::CaptureTexture(device, context, texture3, im);
const DirectX::Image *realImage = im.GetImage(0, 0, 0);
HRESULT hr2 = DirectX::SaveToWICFile(*realImage, DirectX::WIC_FLAGS_NONE, GUID_ContainerFormatPng, L"output_tex3.png", NULL);
DirectX::CaptureTexture(device, context, texture2, im);
realImage = im.GetImage(0, 0, 0);
hr2 = DirectX::SaveToWICFile(*realImage, DirectX::WIC_FLAGS_NONE, GUID_ContainerFormatPng, L"output_tex2.png", NULL);
    float4 val5 = tex2.Sample(sam, input.Tex4);