렌더링 엔진의 일부분을 리펙토링하려고합니다. 쉐이더가 실제로 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);
}
왜 downvote? – benjist