2013-12-10 5 views
0

저는 지금 간단한 .NET 렌더러에서 작업 중이며 한 달 동안 같은 돌을 계속 누르고 있습니다 :DirectX11 효과 변수 업데이트 - 언제 발생합니까?

SlimDX 개발자가 DX11 용으로 컴파일 한 효과 프레임 워크를 사용하고 있으며 EffectVariables를 업데이트하는 데 어려움을 겪고 있습니다. 렌더링 루프 내부 (모든 DrawIndexed 호출 후에 벡터 값을 업데이트해야 함). (필터링)과 같은 코드는 같습니다

public Vector4 wireframeColor = new Vector4(); 
public Vector4 gridColor = new Vector4(); 
wireColorVar = effect.GetVariableByName("wireframeColor").AsVector(); 

wireColorVar.Set(gridColor); 
DrawIndexed(GridDomain); 
foreach model in scene 
{ 
    wireColorVar.Set(wireframeColor); 
    DrawIndexed(modelDomain); 
} 

.FX 파일은 다음과 같습니다

cbuffer ColorBuffer 
{ 
    float4 wireframeColor; 
    float4 diffuseColor; 
}; 
float4 PVertex_Wire_PShader(PVertex_PInput input) : SV_TARGET 
{ 
    return wireframeColor; 
} 

문제는 모든 렌더링 패스를 적용 할 때마다, 쉐이더에서 그들은 단지 마지막으로 알려진 변수 값을 처리한다는 것입니다 - 즉 wireframeColor를 사용하고 결코 gridColor 값을 사용하지 마십시오. 이 문제가 잠시 동안 있었기 때문에 모든 유형의 EffectVariables에 버퍼에서 ShaderResources (예 : UAViews)에 적용된다는 사실을 분명히 알 수 있습니다. 이는 정말 실망 스럽습니다. 효과 변수는 항상 마지막 호출 된 값을 사용하는 경향이 있습니다. DeviceContext.Flush()는 아무것도주지 않지만 실제로는 GPU 명령을 일종의 enqueing하는 것처럼 보입니다. 효과를 적용하면 변수의 변화를 플러시하지 않습니다 통과 같은

Only source of info for now, and it didn't work

보인다. 계산 쉐이더가 필요했을 때 쉐이더 스테이지의 명시 적으로 배치 된 변수 (레지스터 색인 별)에 수동으로 resourceview를 적용해야했습니다.

이 효과 구현 문제입니까? 필연적 인 것은 아니지만 낮은 수준의 상수 버퍼 할당을 사용할 수는 있지만 효과를 전혀 사용하지 않아도됩니다.

P. 오, 그리고 diffuseColor 필드를 사용하거나 변수 개수를 곱하는 다른 방법을 사용하지 않는 것이 좋습니다. swapChain.Present() 호출간에 변수의 값을 여러 번 변경해야합니다.

감사합니다.

+0

코드에서 EffectPass.Apply를 호출합니까? DrawIndexed에 대한 코드를 보는 데 유용할까요? – catflier

답변

0

기본 DX11 셰이더 메커니즘으로 전환 된 Microsoft 효과는 GPU 명령을 적용하는 동안 이상한 논리를 따르는 것 같습니다.

관련 문제