정점 버퍼를 사용하지 않고 컴퓨팅 셰이더 결과를 정점 셰이더에 어떻게 공급할 수 있습니까?

지그프리드 스테판

세부 사항으로 들어가기 전에 문제를 간략히 설명하겠습니다.

RWStructuredBuffers를 사용하여 계산 셰이더 (CS)의 출력을 저장합니다. 정점 및 픽셀 셰이더는 RWStructuredBuffers에서 읽을 수 없으므로 StructuredBuffer를 동일한 슬롯 (u0 / t0) 및 (u4 / t4)에 매핑합니다.

cbuffer cbWorld : register (b1) 
{
    float4x4 worldViewProj;
    int dummy;
}   

struct VS_IN
{
    float4 pos : POSITION;
    float4 col : COLOR;
};

struct PS_IN
{

    float4 pos : SV_POSITION;
    float4 col : COLOR;
};

RWStructuredBuffer<float4> colorOutputTable : register (u0);    // 2D color data
StructuredBuffer<float4> output2 :            register (t0);    // same as u0
RWStructuredBuffer<int> counterTable :        register (u1);    // depth data for z values
RWStructuredBuffer<VS_IN>vertexTable :        register (u4);    // triangle list
StructuredBuffer<VS_IN>vertexTable2 :         register (t4);    // same as u4

ShaderRecourceView를 사용하여 버퍼에 대한 픽셀 및 / 또는 정점 셰이더 액세스 권한을 부여합니다. 이 개념은 내 픽셀 셰이더에서 잘 작동하지만 정점 셰이더는 0 값만 읽는 것 같습니다 (저는 SV_VertexID를 버퍼에 대한 인덱스로 사용합니다).

PS_IN VS_3DA ( uint vid : SV_VertexID ) 
{           
    PS_IN output = (PS_IN)0; 
    PS_IN input = vertexTable2[vid];
    output.pos = mul(input.pos, worldViewProj); 
    output.col = input.col; 
    return output;
}

hlsl 컴파일러의 오류 메시지 나 경고가없고 renderloop는 60fps (vsync 사용)로 실행되지만 화면은 검은 색으로 유지됩니다. Draw (..)가 호출되기 전에 Color.White로 화면을 비우므로 렌더 파이프 라인이 활성화 된 것 같습니다.

GPU에서 UAView를 통해 삼각형 데이터 콘텐츠를 "vertArray"로 읽어서 정점 버퍼로 되 돌리면 모든 것이 작동합니다.

프로그램:

    let vertices = Buffer.Create(device, BindFlags.VertexBuffer, vertArray)
    context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0))

HLSL :

PS_IN VS_3D (VS_IN input )
{
    PS_IN output = (PS_IN)0;    
    output.pos = mul(input.pos, worldViewProj);
    output.col = input.col; 
    return output;
}

여기에 2D-Vertex / Pixelshaders의 정의가 있습니다. PS_2D는 슬롯 t0의 "output2"버퍼에 액세스합니다. 이것이 바로 3D 버텍스 셰이더 "VS_3DA"에 대해 복제하려는 "트릭"입니다.

float4 PS_2D ( float4 input : SV_Position) : SV_Target
{        
    uint2 pixel =  uint2(input.x, input.y);         
    return output2[ pixel.y * width + pixel.x]; 
}

float4 VS_2D ( uint vid : SV_VertexID ) : SV_POSITION
{
if (vid == 0)
    return float4(-1, -1, 0, 1);
if (vid == 1)
    return float4( 1, -1, 0, 1);
if (vid == 2)
    return float4(-1,  1, 0, 1);    

return float4( 1,  1, 0, 1);    
}

3 일 동안 나는 아무 소용이 없었던 것을 검색하고 실험했다. 내가 수집 한 모든 정보는 SV_VertexID를 사용하는 내 접근 방식이 작동해야 함을 확인하는 것 같습니다.

아무도 조언을 줄 수 있습니까? 내 게시물을 읽어 주셔서 감사합니다!

================================================ ===================

세부:

저는 DirectX 11 컴퓨팅 셰이더의 개념을 매우 좋아하고 대수 컴퓨팅에 사용하고 싶습니다. 테스트 케이스로 프랙탈 (Mandelbrot 세트)을 3D로 렌더링합니다. 모든 것이 예상대로 작동합니다. 벽에있는 마지막 벽돌 하나가 없어졌습니다.

계산은 다음 단계를 따릅니다.

  1. CS를 사용하여 2D 텍스처 계산 (출력은 "counterTable"및 "colorOutbutTable"(작동))

  2. 선택적으로이 텍스처를 화면에 렌더링 (작동)

  3. 다른 CS를 사용하여 메시 생성 (삼각형 목록). 이 CS는 1 단계에서 x, y 및 색상 값을 가져와 z 좌표를 계산하고 마지막으로 각 픽셀에 대해 쿼드를 만듭니다. 결과는“vertexTable”에 저장됩니다. (공장)

  4. 삼각형 목록을 정점 셰이더에 공급 (문제 !!!)

  5. 화면으로 렌더링 (작동-정점 버퍼 사용).

프로그래밍을 위해 F # 3.0과 SharpDX를 .NET 래퍼로 사용합니다. 두 셰이더 (픽셀 및 정점)에 대한 ShaderRessourceView는 동일한 매개 변수 (크기 매개 변수 제외)로 설정됩니다.

let mutable descr = new BufferDescription()     
descr.BindFlags <- BindFlags.UnorderedAccess ||| BindFlags.ShaderResource 
descr.Usage <- ResourceUsage.Default  
descr.CpuAccessFlags <- CpuAccessFlags.None
descr.StructureByteStride <- xxx    / / depends on shader
descr.SizeInBytes <-  yyy       / / depends on shader
descr.OptionFlags <- ResourceOptionFlags.BufferStructured

여기에 특별한 것은 없습니다. 2D 버퍼 생성 (슬롯 t0의 버퍼 "output2"에 바인딩) :

outputBuffer2D <- new Buffer(device, descr) 
outputView2D <- new UnorderedAccessView (device, outputBuffer2D)  
shaderResourceView2D <- new ShaderResourceView (device, outputBuffer2D)

3D 버퍼 생성 (슬롯 t4의 "vertexTable2"에 바인딩) :

vertexBuffer3D <- new Buffer(device, descr) 
shaderResourceView3D <- new ShaderResourceView (device, vertexBuffer3D)
//  UAView not required here

2D 용 리소스 설정 :

context.InputAssembler.PrimitiveTopology <- PrimitiveTopology.TriangleStrip
context.OutputMerger.SetRenderTargets(renderTargetView2D)
context.OutputMerger.SetDepthStencilState(depthStencilState2D)
context.VertexShader.Set (vertexShader2D)
context.PixelShader.Set (pixelShader2D) 

2D 렌더링 :

context.PixelShader.SetShaderResource(COLOR_OUT_SLOT, shaderResourceView2D)
context.PixelShader.SetConstantBuffer(CONSTANT_SLOT_GLOBAL, constantBuffer2D )
context.ClearRenderTargetView (renderTargetView2D, Color.White.ToColor4())         
context.Draw(4,0)                                                
swapChain.Present(1, PresentFlags.None)            

3D 용 리소스 설정 :

context.InputAssembler.PrimitiveTopology <- PrimitiveTopology.TriangleList
context.OutputMerger.SetTargets(depthView3D, renderTargetView2D)
context.VertexShader.SetShaderResource(TRIANGLE_SLOT, shaderResourceView3D )
context.VertexShader.SetConstantBuffer(CONSTANT_SLOT_3D, constantBuffer3D)
context.VertexShader.Set(vertexShader3D)
context.PixelShader.Set(pixelShader3D)

3D 렌더링 (작동하지 않음 – 출력 결과로 검은 색 화면)

context.ClearDepthStencilView(depthView3D, DepthStencilClearFlags.Depth, 1.0f, 0uy)
context.Draw(dataXsize * dataYsize * 6, 0)
swapChain.Present(1, PresentFlags.None)

마지막으로 슬롯 번호 :

static let CONSTANT_SLOT_GLOBAL = 0
static let CONSTANT_SLOT_3D = 1
static let COLOR_OUT_SLOT = 0
static let COUNTER_SLOT = 1
static let COLOR_SLOT = 2    
static let TRIANGLE_SLOT = 4
고양이

좋아, 내가 제안하는 첫 번째 것은 디버그 레이어를 켜고 (디바이스를 만들 때 디버그 플래그 사용) 프로젝트 속성, 디버그 탭으로 이동하여 "비 관리 코드 디버깅 활성화"또는 "네이티브 코드 디버깅 활성화"를 선택하는 것입니다.

프로그램 디버그를 시작하면 파이프 라인 상태에 문제가있는 경우 런타임에서 잠재적 인 경고를 표시합니다.

한 가지 잠재적 인 문제 (게시 한 내용에서 가장 가능성이 높은 문제) : 디스패치 후 컴퓨팅 셰이더 UAV 슬롯을 정리해야합니다. vertexTable2를 정점 셰이더에 바인딩하려고하지만 리소스가 여전히 컴퓨 트 셰이더 출력으로 바인딩 된 경우 런타임은 ShaderView를 자동으로 null로 설정합니다 (읽으려고하면 0을 반환합니다).

Compute Shader를 정리하려면 디스패치로 완료된 디바이스 컨텍스트에서 다음을 호출하십시오.

ComputeShader.SetUnorderedAccessView(TRIANGLE_SLOT, null)

PixelShader는 RWStructuredBuffer에 액세스 할 수 있습니다 (기술적으로 기능 수준 11.1이있는 경우 모든 셰이더 유형에 RWStructuredBuffer를 사용할 수 있습니다. 즉, 최신 ATI 카드 및 Windows 8 이상을 의미 함).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관