void overlay::init_shaders() { auto device = d3d_device::instance()->raw(); com_ptr<ID3DBlob> vs_blob, ps_blob; const string & vs_code = vertex_shader_code(); const string & ps_code = pixel_shader_code(); HRESULT result = D3DCompile(vs_code.c_str(), vs_code.size(), nullptr, nullptr, nullptr, "vs", "vs_5_0", 0, 0, &vs_blob, nullptr); if (FAILED(result)) throw std::runtime_error("Error compiling vertex shader"); result = D3DCompile(ps_code.c_str(), ps_code.size(), nullptr, nullptr, nullptr, "ps", "ps_5_0", 0, 0, &ps_blob, nullptr); if (FAILED(result)) throw std::runtime_error("Error compiling pixel shader"); D3D11_INPUT_ELEMENT_DESC input_desc[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 } }; device->CreateInputLayout(input_desc, 2, vs_blob->GetBufferPointer(), vs_blob->GetBufferSize(), &input_layout); device->CreateVertexShader(vs_blob->GetBufferPointer(), vs_blob->GetBufferSize(), nullptr, &vertex_shader); device->CreatePixelShader(ps_blob->GetBufferPointer(), ps_blob->GetBufferSize(), nullptr, &pixel_shader); }
GLuint ShaderProgram(const std::string &vertex_shader_file, const std::string &fragment_shader_file) { // Create shaders auto vertex_shader_id = glCreateShader(GL_VERTEX_SHADER); auto fragment_shader_id = glCreateShader(GL_FRAGMENT_SHADER); auto result = GL_FALSE; auto info_length = 0; // Load shader code std::ifstream vertex_shader_stream(vertex_shader_file); std::string vertex_shader_code((std::istreambuf_iterator<char>(vertex_shader_stream)), std::istreambuf_iterator<char>()); std::ifstream fragment_shader_stream(fragment_shader_file); std::string fragment_shader_code((std::istreambuf_iterator<char>(fragment_shader_stream)), std::istreambuf_iterator<char>()); // Compile vertex shader std::cout << "Compiling Vertex Shader ..." << std::endl; auto vertex_shader_code_ptr = vertex_shader_code.c_str(); glShaderSource(vertex_shader_id, 1, &vertex_shader_code_ptr, NULL); glCompileShader(vertex_shader_id); // Check vertex shader log glGetShaderiv(vertex_shader_id, GL_COMPILE_STATUS, &result); if (result == GL_FALSE) { glGetShaderiv(vertex_shader_id, GL_INFO_LOG_LENGTH, &info_length); std::string vertex_shader_log((unsigned int)info_length, ' '); glGetShaderInfoLog(vertex_shader_id, info_length, NULL, &vertex_shader_log[0]); std::cout << vertex_shader_log << std::endl; } // Compile fragment shader std::cout << "Compiling Fragment Shader ..." << std::endl; auto fragment_shader_code_ptr = fragment_shader_code.c_str(); glShaderSource(fragment_shader_id, 1, &fragment_shader_code_ptr, NULL); glCompileShader(fragment_shader_id); // Check fragment shader log glGetShaderiv(fragment_shader_id, GL_COMPILE_STATUS, &result); if (result == GL_FALSE) { glGetShaderiv(fragment_shader_id, GL_INFO_LOG_LENGTH, &info_length); std::string fragment_shader_log((unsigned long)info_length, ' '); glGetShaderInfoLog(fragment_shader_id, info_length, NULL, &fragment_shader_log[0]); std::cout << fragment_shader_log << std::endl; } // Create and link the program std::cout << "Linking Shader Program ..." << std::endl; auto program_id = glCreateProgram(); glAttachShader(program_id, vertex_shader_id); glAttachShader(program_id, fragment_shader_id); glBindFragDataLocation(program_id, 0, "FragmentColor"); glLinkProgram(program_id); // Check program log glGetProgramiv(program_id, GL_LINK_STATUS, &result); if (result == GL_FALSE) { glGetProgramiv(program_id, GL_INFO_LOG_LENGTH, &info_length); std::string program_log((unsigned long)info_length, ' '); glGetProgramInfoLog(program_id, info_length, NULL, &program_log[0]); std::cout << program_log << std::endl; } glDeleteShader(vertex_shader_id); glDeleteShader(fragment_shader_id); return program_id; }