#include "../../../include/RenderBackend/OpenGL/PixelShader.hpp" #include "../../../include/RenderBackend/OpenGL/opengl.hpp" #include "../../../include/RenderBackend/OpenGL/CompiledShader.hpp" namespace amalgine { PixelShader::PixelShader() { glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxAttribs); } void PixelShader::defineMain(PixelShaderMainFunc mainFunc) { if(mainFuncDefined) throw ShaderFunctionAlreadyDefined("main"); writeBody("void main() {\n"); mainFunc(); mainFuncDefined = true; writeBody("}\n\n"); } Result PixelShader::compile() { if(!mainFuncDefined) return Result::Err("main function not defined (defineMain not called)"); GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); std::string verterShaderSource = build(); const char *verterShaderSourcePtr = verterShaderSource.c_str(); printf("Vertex shader:\n%s\n", verterShaderSourcePtr); glShaderSource(fragmentShaderId, 1, &verterShaderSourcePtr, NULL); glCompileShader(fragmentShaderId); GLint status; glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &status); std::string compileLog = getShaderCompileLog((u32)fragmentShaderId); if(status == GL_TRUE) { if(!compileLog.empty()) printf("Pixel shader compile log:\n%s", compileLog.c_str()); return Result::Ok(new CompiledPixelShader(fragmentShaderId, move(inputAttributes))); } else return Result::Err(compileLog); } }