void StaticObject::Draw() const { // Use the appropriate shader (depth or model) UseShader(); // Draw the loaded model model->Draw(Scene::Instance()->IsRenderingDepth() ? nullptr : shader.get()); }
bool Shader::SetShaderFile(char* sVSFileName, char* sFSFileName) { if (glIsProgram(m_Program)) { CleanUp(); } if (!ReadVertextShader(sVSFileName) || !ReadFragmentShader(sFSFileName)) { return false; } GLint vertCompiled, fragCompiled; //状态值 GLint linked; //创建shader对象 m_Vert = glCreateShader(GL_VERTEX_SHADER); m_Frag = glCreateShader(GL_FRAGMENT_SHADER); const GLchar *vv = m_VertexShader; const GLchar *ff = m_FragmentShader; //添加shader glShaderSource(m_Vert,1,&vv,NULL); glShaderSource(m_Frag,1,&ff,NULL); //编译shader glCompileShader(m_Vert); printOpenGLError(); //检查OpenGL错误 //glGetObjectParameterivARB(m_Vert, GL_OBJECT_COMPILE_STATUS_ARB, &vertCompiled); glGetShaderiv(m_Vert, GL_COMPILE_STATUS, &vertCompiled); printShaderInfoLog(m_Vert); glCompileShader(m_Frag); printOpenGLError(); //检查OpenGL错误 //glGetObjectParameterivARB(m_Frag, GL_OBJECT_COMPILE_STATUS_ARB, &fragCompiled); glGetShaderiv(m_Frag, GL_COMPILE_STATUS, &fragCompiled); printShaderInfoLog(m_Frag); if (!vertCompiled || !fragCompiled) return false; //创建程序对象 m_Program = glCreateProgram(); //绑定shader到程序对象 glAttachShader(m_Program,m_Vert); glAttachShader(m_Program,m_Frag); //链接程序 glLinkProgram(m_Program); printOpenGLError(); //检查OpenGL错误 //glGetObjectParameterivARB(m_Program, GL_OBJECT_COMPILE_STATUS_ARB, &linked); glGetProgramiv(m_Program, GL_LINK_STATUS, &linked); printProgramInfoLog(m_Program); if (!linked) return false; UseShader(true); return true; }
GLuint Shader::checkUniform(const char* uniName) { UseShader (); // log msg only in the DEBUG version int i = glGetUniformLocation (m_program, uniName); #ifdef _DEBUG if (i == -1) { std::cout << "UNIFORM " + std::string(uniName) + " DOES NOT EXIST!\n"; } #endif return i; }