2017-04-18 13 views
0

여기에서 레거시 시스템을 다루므로 셰이더는 사용할 수 없습니다.OpenGL에 해당하는 DirectX 렌더 스테이트

수정해야 할 코드에는 디스플레이의 대부분이 텍스처로 렌더링되고 그 텍스처가 화면에 그려지는 렌더링 파이프 라인이 있습니다. 처음에는 텍스처로 렌더링 된 적이없는 것처럼 보입니다.

그것은이 함수를 호출하여 다이렉트에서이를 수행 :

void RenderTargetChanged(bool isRenderToTexture) 
{ 
    if (!isRenderToTexture) 
    { 
     gDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); 
     gDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SRCBLENDALPHA,D3DBLEND_SRCALPHA); 
     gDevice->SetRenderState(D3DRS_DESTBLENDALPHA,D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE,FALSE); 
    } 
    else 
    { 
     gDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
     gDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE); 
     gDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); 
    } 
} 

는 OpenGL 상응하는 무엇입니까 (공지 사항, 두 지점 사이의 유일한 차이는 D3DRS_SRCBLENDALPHA 및 D3DRS_SEPERATEALPHABLENDENABLE의 값이다)?

나는 서로 다른 조합을 시도해 보면서 미쳐 버렸습니다. 그리고 CLOSE를 얻을 수는 있지만, 처음에는 텍스처로 렌더링되지 않은 것처럼 보입니다. 반투명 어느 곳이든 어둡거나 밝은 곳으로갑니다.

답변

3

누락 된 내용이 없으면 D3DBLEND enumerationglBlendFunc()의 설명서를 비교할 수 있어야합니다. GL_SRC_ALPHA

  • D3DBLEND_INVSRCALPHAGL_ONE_MINUS_SRC_ALPHA
  • D3DBLEND_ONE로 변환에

    • D3DBLEND_SRCALPHA는 별도로 사용할 필요가 다음 알파 구성 요소를 지정하려는 경우 GL_ONE

    로 변환 변환 glBlendFuncSeparate() :

    glEnable(GL_BLEND); 
    
    if (!isRenderToTexture) { 
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
        glBlendEquation(GL_FUNC_ADD); 
    } else { 
        glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
        glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); 
    }