ANGLE의 반별칭

6307 단어 OpenGLESANGLE
ANGLE는 OpenGLES의 DirectX 설치입니다.Windows 응용 프로그램으로 OpenGLES를 개발할 때 매우 편리하다.본고는 ANGLE 개발 시 전장경 톱니 저항(다중 샘플링 톱니 저항)을 사용하는 방법을 소개한다.
(2015년 11월에 시도한 글입니다. 지금은 이런 번거로운 일이 필요 없을 것 같습니다.)
eglChooseConfig에서 유효한 > 결론, 실패
OpenGLES2.0은 다중 샘플링을 지원하는 것이 아닙니다.그러나 iOS용 애플리케이션은 XCode에서 설정할 수 있는 확장자로 지원되는 것으로 보입니다.안드로이드도 OS 설정으로 완성된 것 같아요.
ANGLE도 이런 느낌을 받을 수 있을 것 같아서 EGL을 초기화할 때 멀티 샘플링을 사용하기 위해 이런 느낌으로 구성해 봤습니다.
EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
EGLint eglMajorVersion;
EGLint eglMinorVersion;

if(eglDisplay == EGL_NO_DISPLAY)
{
    return;
}

if(!eglInitialize(eglDisplay, &eglMajorVersion, &eglMinorVersion))
{
    return;
}

EGLint attrs[] =
{
    EGL_SURFACE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_RED_SIZE, 5,
    EGL_GREEN_SIZE, 6,
    EGL_BLUE_SIZE, 5,
    EGL_ALPHA_SIZE, 0,
    EGL_DEPTH_SIZE,16,
    EGL_STENCIL_SIZE, 8,
    EGL_SAMPLE_BUFFERS, 1, //マルチサンプリングを有効
    EGL_SAMPLES, 4, //サンプリング数を指定
    EGL_NONE
};

EGLint numConfig = 0;
const EGLint maxConfigs = 10;
EGLConfig eglConfigs[maxConfigs];
EGLBoolean bsuccess = eglChooseConfig(eglDisplay, attrs, eglConfigs, maxConfigs, &numConfig);
크롬의 웹GL도 앤티앨리어싱을 효과적으로 활용할 수 있을 거라고 생각했는데 아쉽게도 실패했다.
ANGLE 소스 코드 봐봐.
eglChooseConfig가 실패로 되돌아왔기 때문에 이 부근의 원본 코드를 봤습니다.렌더링 11: generate Configs() 내에 있습니다.아마도 대응하는 구성 부분일 것이다.
Render11.cpp
//981行目付近
config.sampleBuffers = 0; // FIXME: enumerate multi-sampling
config.samples = 0;
그렇군요, 대응하지 않은 것 같군요.
앤티앨리어싱으로 강제 덮어쓰기
어쨌든 반톱니 감각을 느끼게 하려는 동기를 바탕으로 반톱니 개조를 강제로 하고 싶다.ANGLE에는 DirectX11 룬다라와 DirectX9 룬다라 두 종류가 있는데, 여기서 먼저 DirectX11 룬다라를 개조한다.
SwapChain 11의 개조
후면 버퍼 관계를 관리하는 것은 SwapChaain 11 클래스입니다.여기에 생성된 버퍼 메모리를 다중 샘플링으로 변경하면 톱니 저항이 생길 것입니다.libangLE의 주제 중 "libangLE"- [render] - [d3d] - [d3d11]의 SwapChain 11입니다.h 및 SwapChain 11.cpp를 개조하다.
구성원 변수 추가
SwapChain11.h에 다음 세 개의 구성원 변수를 추가합니다.
SwapChain11.h
// SwapChain11クラスの定義内
int sampleNum;
ID3D11Texture2D* pResolveTexture;
ID3D11ShaderResourceView* pRenderTextureSRV;
DXGI_FORMAT resolveFormat;
이 구성원 변수는 구조기로 초기화하세요.
SwapChain11.cpp
//SwapChain11::SwapChain11定義内
sampleNum = 8; //サンプリング数
pResolveTexture = NULL;
pRenderTextureSRV = NULL;
우선 샘플링 수를 8로 설정합니다.
개조지
SwapChain 11의 구현에서reset OffscreenTexture 방법으로 기본 캐시와 깊이 버퍼를 생성하고 swapRect 방법으로 그린 결과를 표시합니다.따라서 이 두 가지 방법을 개조해야 한다.
reset OffscreenTexture 방법의 개조
SwapChain 11: reset OffscreenTexture 방법을 변경합니다.
우선 샘플링 수에 대응하는 quality를 계산한다.대충 이런 느낌.
UINT quality = 0;
device->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, sampleNum, &quality);
quality -= 1;
텍스트를 생성할 때 SampleNum 및 quality를 지정합니다.후방 버퍼와 깊이 버퍼의 두 곳을 변경합니다.
offscreenTextureDesc.SampleDesc.Count = sampleNum;
offscreenTextureDesc.SampleDesc.Quality = quality;
depthStencilTextureDesc.SampleDesc.Count = sampleNum;
depthStencilTextureDesc.SampleDesc.Quality = quality;
다중 샘플링을 효율적으로 수행하기 위해 D3D11RENDER_TARGET_VIEW_DESC 등의 ViewDimension도 D3D11입니다.RTV_DIMENSION_TEXTURE2DMS로 변경해야 합니다.다음 4곳도 다시 써야 한다.
offscreenRTVDesc.ViewDimension = (sampleNum > 1) ? D3D11_RTV_DIMENSION_TEXTURE2DMS : D3D11_RTV_DIMENSION_TEXTURE2D;
offscreenSRVDesc.ViewDimension = (sampleNum > 1) ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D;
depthStencilDesc.ViewDimension = (sampleNum > 1) ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilSRVDesc.ViewDimension = (sampleNum > 1) ? D3D11_SRV_DIMENSION_TEXTURE2DMS: D3D11_SRV_DIMENSION_TEXTURE2D;
그러면 방금 말한 바와 같이 생성된 캐시 이미지는 swapRect 방법에서 그려져 화면에 반영됩니다.그러나 다채로운 샘플링에 효과적인 무늬는 직접 음영원으로 사용할 수 없기 때문에 다채로운 샘플링을 해결하는 무늬에 먼저 그려야 한다.따라서 해결된 무늬와 음영 자원을 만듭니다.
코드 블록mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture);을 만든 후에 이 생성 코드를 추가합니다.해결할 때 무늬 격식이 필요하기 때문에 여기에 보관해 두세요.
//アンチエイリアスの解決用
if (sampleNum > 1)
{
    D3D11_TEXTURE2D_DESC descTex = offscreenTextureDesc;
    descTex.SampleDesc.Count = 1;
    descTex.SampleDesc.Quality = 0;

    device->CreateTexture2D(&descTex, NULL, &pResolveTexture);

    D3D11_SHADER_RESOURCE_VIEW_DESC resolveSRVDesc;
    resolveSRVDesc.Format = backbufferFormatInfo.srvFormat;
    resolveSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    resolveSRVDesc.Texture2D.MostDetailedMip = 0;
    resolveSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);

    device->CreateShaderResourceView(pResolveTexture, &resolveSRVDesc, &pRenderTextureSRV);

    resolveFormat = backbufferFormatInfo.texFormat;
}
새로운 무늬 대상이 추가되었기 때문에release OffscreenTexture 방법에 열 코드가 추가되었습니다.
SafeRelease(pResolveTexture);
SafeRelease(pRenderTextureSRV);
swapRect 방법의 개조
swapRect 내에서 재현된 이미지가 화면에 표시됩니다.이때 다채로운 샘플링 무늬를 해결하고 무늬의 차폐 자원을 설정하면 화면에 톱니 저항 이미지가 나타날 것이다.그림자 자원mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView);을 설정한 변경 사항은 다음과 같습니다.
if (sampleNum > 1)
{
    deviceContext->ResolveSubresource(
        pResolveTexture, 0, mOffscreenTexture, 0,resolveFormat);
    mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, pRenderTextureSRV);
}
else
{
    mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView);
}
위에서 반별명이 있는 후방 버퍼를 만들 것입니다.
실행 결과
샘플 helloTriangle을 실행해 보세요.최초의 이미지는 개조 전이고, 이후의 이미지는 개조 후의 결과이다.
개조 전

개조 후

ANGLE의 구축 방법 등은 여기. 기사를 참조하십시오.
총결산
ANGLE에서 다중 샘플링을 사용하는 개조 방법을 소개했다.솔직히 정말 이런 일을 해야 한다는 게 의심스러웠는데 조사만 하면 나오지 않길래 무리하게 리모델링을 했죠.더 스마트한(또는 정규적인) 방법을 아는 사람이 있다면 알려주세요.

좋은 웹페이지 즐겨찾기