void GraphicsContext3D::getShaderiv(Platform3DObject shader, GC3Denum pname, GC3Dint* value) { ASSERT(shader); makeContextCurrent(); HashMap<Platform3DObject, ShaderSourceEntry>::iterator result = m_shaderSourceMap.find(shader); switch (pname) { case DELETE_STATUS: case SHADER_TYPE: ::glGetShaderiv(shader, pname, value); break; case COMPILE_STATUS: if (result == m_shaderSourceMap.end()) { *value = static_cast<int>(false); return; } *value = static_cast<int>(result->second.isValid); break; case INFO_LOG_LENGTH: if (result == m_shaderSourceMap.end()) { *value = 0; return; } *value = getShaderInfoLog(shader).length(); break; case SHADER_SOURCE_LENGTH: *value = getShaderSource(shader).length(); break; default: synthesizeGLError(INVALID_ENUM); } }
//! Creates a shader object of given type from given source file void Shader::addShader(shaderType type, const char * const file) { //create shader GLuint shader; if((shader = glCreateShader(type)) == 0) { checkOpenGLError(); throw std::runtime_error("Unable to create shader."); } //load source std::string source; source = loadFile(file); //add source to shader object const char* s = source.c_str(); glShaderSource(shader, 1, &s, NULL); //compile glCompileShader(shader); //check status int compileStatus; glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus); if(compileStatus != GL_TRUE) { std::cerr << getShaderInfoLog(shader) << std::endl; throw std::runtime_error("Unable to compile shader."); } //attach to program glAttachShader(id, shader); }
std::string VSShaderLib::getAllInfoLogs() { std::string s; for (int i = 0; i < VSShaderLib::COUNT_SHADER_TYPE; ++i) { if (pShader[i]) { getShaderInfoLog((VSShaderLib::ShaderType)i); s.append(VSShaderLib::spStringShaderTypes[i]); s.append(": "); s.append(pResult); s.append("\n"); //s += VSShaderLib::spStringShaderTypes[i] + ": " + pResult + "\n"; } } if (pProgram) { getProgramInfoLog(); s += "Program: " + pResult; if (isProgramValid()) s += " - Valid\n"; else s += " - Not Valid\n"; } pResult = s; return pResult; }
GLuint compileShader(GLenum type, const char *source) { /* create shader object */ GLuint shader = glCreateShader(type); if (shader == 0) { std::cerr << "Failed to create shader object: " << errorToStr(glGetError()) << std::endl; return 0; } /* copy the sources to the shader object */ glShaderSource(shader, 1, &source, NULL); /* compile the sources */ glCompileShader(shader); /* query compilation status */ GLint status = GL_FALSE; glGetShaderiv(shader, GL_COMPILE_STATUS, &status); /* print compilation log */ std::cerr << "Compilation status: " << (status == GL_TRUE ? "succeeded" : "failed") << std::endl; std::cerr << getShaderInfoLog(shader) << std::endl; /* check compilation status */ if (status == GL_FALSE) { glDeleteShader(shader); return 0; } return shader; }
GLuint compileShader(const GLenum type, const char * source) { GLuint shader = glCreateShader(type); if(shader == 0) throw GL_Exception("glCreateShader failed"); glShaderSource(shader, 1, &source, NULL); glCompileShader(shader); std::cout << getShaderInfoLog(shader); int compileStatus; glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus); if(compileStatus == GL_FALSE) throw std::runtime_error("shader compilation failed"); return shader; }
bool ShaderProgram::attachShader(GLenum type, const char *source, GLuint *shader_id) { assert(glIsProgram(m_program)); /* create shader object */ GLuint shader = glCreateShader(type); if (shader == 0) { ERROR("Failed to create shader object: " << errorToStr(glGetError())); return false; } /* copy the sources to the shader object */ glShaderSource(shader, 1, &source, NULL); /* compile the sources */ glCompileShader(shader); /* query compilation status */ GLint status = GL_FALSE; glGetShaderiv(shader, GL_COMPILE_STATUS, &status); /* print compilation log */ std::cerr << "Compilation status: " << (status == GL_TRUE ? "succeeded" : "failed") << std::endl; std::cerr << getShaderInfoLog(shader) << std::endl; /* check compilation status */ if (status == GL_FALSE) { glDeleteShader(shader); return false; } /* attach the shader to program */ glAttachShader(m_program, shader); if (shader_id == nullptr) { glDeleteShader(shader); } else { *shader_id = shader; } return true; }
GLuint Shader::compile(GLuint shaderType, const char* shaderCode) { if(shaderType != GL_VERTEX_SHADER && shaderType != GL_FRAGMENT_SHADER && shaderType != GL_GEOMETRY_SHADER && shaderType != GL_TESS_CONTROL_SHADER && shaderType != GL_TESS_EVALUATION_SHADER) return 0; GLuint shader = glCreateShader(shaderType); glShaderSource(shader, 1, &shaderCode, NULL); glCompileShader(shader); // Error checking. GLint compiled; glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); if(!compiled) { std::cerr << getShaderInfoLog(shader) << std::endl; return false; } return shader; }