2016-10-09 2 views
-1

렌더링 엔진의 일부분을 리펙토링하려고합니다. 쉐이더가 실제로 OpenGL 컨텍스트임을 알아야하는지 궁금합니다. 현재 각 셰이더에는 bind() 및 compileShader() 메서드가 있습니다.이 메서드는 실제로는 OpenGL 컨텍스트를 호출하지만 다른 작업은 수행하지 않습니다.소프트웨어 아키텍처 : OpenGL 쉐이더 생성 및 컴파일

이러한 메서드를 셰이더에 구현하는 것이 일반적으로 보입니다.하지만 정말 좋은 방법입니까? 컨텍스트에서 셰이더를 만들고, 컴파일하고 바인딩하는 것이 더 좋지 않아야합니까? 그리고 셰이더는 필연적으로 컨텍스트를 알아야합니까?

아래의 일부 코드 스 니펫. 여기서 셰이더는 컨텍스트 메서드를 호출하기 때문에 컴파일은 셰이더 자체가 아니라 컨텍스트의 관심사가 될 수 있습니다.

ShaderPtr hdm::shader::fancy_lines_3d_ptr; 
fancy_lines_3d_ptr->compileShader(vert_src.c_str(), frag_src.c_str(), vlayout); 

void Shader::bind() 
{ 
    assert(_shaderObj); 
    _context.bindShader(_shaderObj); 
} 


void Shader::compileShader(const string &vertexSrc, 
          const string &fragmentSrc, 
          hdm::rendering::VERTEX_LAYOUT vlayout) 
{ 
    _context.compileShader(_shaderObj, vertexSrc.c_str(), vertexSrc.length(), SHADER_TYPE::ST_VERTEX); 
    _context.compileShader(_shaderObj, fragmentSrc.c_str(), fragmentSrc.length(), SHADER_TYPE::ST_FRAGMENT); 
    _context.bindAttributeLocations(vlayout, _shaderObj); 
    _context.linkShader(_shaderObj); 
} 
+0

왜 downvote? – benjist

답변

1

OpenGL 및 OOP 프로그래밍에 관해서는 명확한 답을 제공 할 수 없습니다. OpenGL API가 전역 상태를 혼합하는 방식으로 인해 단일 컨텍스트에 제한된 특정 개체 유형과 여러 컨텍스트간에 공유 가능한 다른 개체 유형이 OpenGL을 OOP 모델로 완벽하게 매핑하는 것은 불가능하지는 않더라도 매우 어렵습니다.

셰이더를 생성, 컴파일 및 바인딩하는 것이 더 좋지 않습니까?

예! 실제로 OpenGL 컨텍스트가 OpenGL 객체의 경우 팩토리이되는 것이 좋습니다.

쉐이더는 반드시 컨텍스트를 알아야합니까?

실제로 모든 OpenGL 개체는 관련 컨텍스트를 알아야합니다. 전용 추상적 인 컨텍스트 참조 클래스를 통해이를 구현하는 것이 좋습니다. 그 클래스에서하지 공유 (쉐이더, 프로그램, 프레임 버퍼 오브젝트, VAOs, ...)에있는 개체에 의해 통해 인스턴스 것 하나의 컨텍스트 참조 공유 (이미지가 개체에 의해 통해 인스턴스 것 공유 컨텍스트 참조, 텍스처를 도출 , 버퍼 객체들 ...).

그리고 나서 어떻게 든 컨텍스트 공유 설정을 추적하고이를 공유 컨텍스트 참조에 매핑하는 방법을 구현해야합니다.