GLuint ShaderPrograms::CreateShaderEffect (const char* name) { GLint state; GLuint program; GLuint pixelShader; GLuint vertexShader; const char *vPtr; char tmpName[128]; char buffer[1024 * 64]; vPtr = buffer; program = glCreateProgram(); sprintf (tmpName, "shaders/%s.vs", name); LoadShaderCode (tmpName, buffer); vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vPtr, NULL); glCompileShader(vertexShader); glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &state); if (state != GL_TRUE ) { GLsizei length; glGetShaderInfoLog(vertexShader, sizeof (buffer), &length, buffer); } glAttachShader(program, vertexShader); sprintf (tmpName, "shaders/%s.ps", name); LoadShaderCode (tmpName, buffer); pixelShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(pixelShader, 1, &vPtr, NULL); glCompileShader(pixelShader); glGetShaderiv(pixelShader, GL_COMPILE_STATUS, &state); if (state != GL_TRUE ) { GLsizei length; glGetShaderInfoLog(pixelShader, sizeof (buffer), &length, buffer); } glAttachShader(program, pixelShader); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &state); _ASSERTE (state == GL_TRUE); return program; }
VkPPShader::VkPPShader(PPShader *shader) { auto fb = GetVulkanFrameBuffer(); FString prolog; if (!shader->Uniforms.empty()) prolog = UniformBlockDecl::Create("Uniforms", shader->Uniforms, -1); prolog += shader->Defines; ShaderBuilder vertbuilder; vertbuilder.setVertexShader(LoadShaderCode(shader->VertexShader, "", shader->Version)); VertexShader = vertbuilder.create(shader->VertexShader.GetChars(), fb->device); VertexShader->SetDebugName(shader->VertexShader.GetChars()); ShaderBuilder fragbuilder; fragbuilder.setFragmentShader(LoadShaderCode(shader->FragmentShader, prolog, shader->Version)); FragmentShader = fragbuilder.create(shader->FragmentShader.GetChars(), fb->device); FragmentShader->SetDebugName(shader->FragmentShader.GetChars()); }