bool GLWidget::objectShader::bind(){ const bool b = PG::GL::Shader::bind(); if(!b) return false; PG::GL::Shader::apply(); vertexLoc = getAttributeLocation("vertex"); normalLoc = getAttributeLocation("normal"); uvLoc = getAttributeLocation("uv"); modelMatrixLoc = getUniformLocation("modelMatrix"); projectionMatrixLoc = getUniformLocation("projectionMatrix"); viewMatrixLoc = getUniformLocation("viewMatrix"); textureLoc = getUniformLocation("texture01"); PG::GL::Shader::release(); return true; }
//-------------------------------------------------------------- void ofShader::printActiveAttributes() const{ GLint numAttributes = 0; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &numAttributes); ofLogNotice("ofShader") << numAttributes << " attributes"; GLint attributeMaxLength = 0; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &attributeMaxLength); GLint count = -1; GLenum type = 0; GLchar* attributeName = new GLchar[attributeMaxLength]; stringstream line; for(GLint i = 0; i < numAttributes; i++) { GLsizei length; glGetActiveAttrib(program, i, attributeMaxLength, &length, &count, &type, attributeName); line << " [" << i << "] "; for(int j = 0; j < length; j++) { line << attributeName[j]; } line << " @ index " << getAttributeLocation(attributeName); ofLogNotice("ofShader") << line.str(); line.str(""); } delete [] attributeName; }
void ofShader::setAttribute4fv(const string & name, const float* v, GLsizei stride) const{ if(bLoaded){ GLint location = getAttributeLocation(name); if (location != -1) { glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE, stride, v); glEnableVertexAttribArray(location); } } }
std::vector<GLint> Program::getAttributeLocations(const std::vector<std::string> & names) const { std::vector<GLint> locations(names.size()); for (unsigned i = 0; i<names.size(); ++i) { locations[i] = getAttributeLocation(names[i]); } return locations; }
/** Disable an attribute */ void GLShaderProgram::disableAttribute(const char* name) { GLint location = getAttributeLocation(name); if (location == -1) { fprintf(stderr, "Attempt to disable nonexistent attribute: %s\n", name); } else { glEnableVertexAttribArray(location); } }
bool GLWidget::lineShader::bind(){ const bool b = PG::GL::Shader::bind(); if(!b) return false; PG::GL::Shader::apply(); vertexLoc = getAttributeLocation("vertex"); modelMatrixLoc = getUniformLocation("modelMatrix"); projectionMatrixLoc = getUniformLocation("projectionMatrix"); viewMatrixLoc = getUniformLocation("viewMatrix"); PG::GL::Shader::release(); return true; }
bool GLWidget::spriteShader::bind(){ const bool b = PG::GL::Shader::bind(); if(!b) return false; PG::GL::Shader::apply(); vertexLoc = getAttributeLocation("vertex"); normalLoc = getAttributeLocation("normal"); uvLoc = getAttributeLocation("uv"); modelMatrixLoc = getUniformLocation("modelMatrix"); projectionMatrixLoc = getUniformLocation("projectionMatrix"); viewMatrixLoc = getUniformLocation("viewMatrix"); idtextureLoc = getUniformLocation("idtexture"); colorTableLoc = getUniformLocation("colorTable"); spriteSizeLoc = getUniformLocation("spriteSize"); startLoc = getUniformLocation("start"); sizeLoc = getUniformLocation("size"); mirrorLoc = getUniformLocation("mirror"); colorTableStartLoc = getUniformLocation("colortableStart"); PG::GL::Shader::release(); return true; }
void ofxShader::printActiveAttributes() { GLint numAttributes = 0; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &numAttributes); cout << numAttributes << " attributes:" << endl; GLint attributeMaxLength = 0; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &attributeMaxLength); GLint count = -1; GLenum type = 0; GLchar* attributeName = new GLchar[attributeMaxLength]; for(GLint i = 0; i < numAttributes; i++) { GLsizei length; glGetActiveAttrib(program, i, attributeMaxLength, &length, &count, &type, attributeName); cout << " [" << i << "] "; for(int j = 0; j < length; j++) cout <<attributeName[j]; cout << " @ index " << getAttributeLocation(attributeName) << endl; } delete [] attributeName; }
int main(int argc, char ** argv) { initGlutAndCreateWindow(argc, argv); initGlew(); // compile and link shader programs, also sets program global variable openGLProgramObject = compileShaders(); // get location/handle for coord variable in the vertex shader coordAttribute = getAttributeLocation("coord"); // set the render function to continually call in the main loop glutDisplayFunc(render); // glClearColor only sets state, does not actually clear anything glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // done with setup, now constantly loop and call render function glutMainLoop(); return 1; }
void Shader::setVector3Attribute(const std::string& _name, float _v1, float _v2, float _v3) const { assert(programObj_ != 0); glVertexAttrib4f(getAttributeLocation(_name.c_str()), _v1, _v2, _v3, 1); }
void Shader::setFloatAttribute(const std::string& _name, float _f) const { assert(programObj_ != 0); glVertexAttrib1f(getAttributeLocation(_name.c_str()), _f); }