void BrickProgram::SetupProgram() { glUseProgram(GetProgram()); glUniform3f(GetUniformLoc(GetProgram(), "BrickColor"), 1.0f, 0.3f, 0.2f); glUniform3f(GetUniformLoc(GetProgram(), "MortarColor"), 0.85f, 0.86f, 0.84f); glUniform2f(GetUniformLoc(GetProgram(), "BrickSize"), 0.3f, 0.15f); glUniform2f(GetUniformLoc(GetProgram(), "BrickPercent"), 0.9f, 0.85f); glUniform3f(GetUniformLoc(GetProgram(), "LightPosition"), 1.0f, 0.1f, 5.0f); }
void Thin3DGLShaderSet::SetMatrix4x4(const char *name, const float value[16]) { glUseProgram(program_); int loc = GetUniformLoc(name); if (loc != -1) { glUniformMatrix4fv(loc, 1, false, value); } }
void Thin3DGLShaderSet::SetVector(const char *name, float *value, int n) { glUseProgram(program_); int loc = GetUniformLoc(name); if (loc != -1) { switch (n) { case 1: glUniform1fv(loc, 1, value); break; case 2: glUniform1fv(loc, 2, value); break; case 3: glUniform1fv(loc, 3, value); break; case 4: glUniform1fv(loc, 4, value); break; } } }
bool Thin3DGLShaderSet::Link() { program_ = glCreateProgram(); glAttachShader(program_, vshader->GetShader()); glAttachShader(program_, fshader->GetShader()); // Bind all the common vertex data points. Mismatching ones will be ignored. glBindAttribLocation(program_, SEM_POSITION, "Position"); glBindAttribLocation(program_, SEM_COLOR0, "Color0"); glBindAttribLocation(program_, SEM_TEXCOORD0, "TexCoord0"); glBindAttribLocation(program_, SEM_NORMAL, "Normal"); glBindAttribLocation(program_, SEM_TANGENT, "Tangent"); glBindAttribLocation(program_, SEM_BINORMAL, "Binormal"); glLinkProgram(program_); GLint linkStatus = GL_FALSE; glGetProgramiv(program_, GL_LINK_STATUS, &linkStatus); if (linkStatus != GL_TRUE) { GLint bufLength = 0; glGetProgramiv(program_, GL_INFO_LOG_LENGTH, &bufLength); if (bufLength) { char* buf = new char[bufLength]; glGetProgramInfoLog(program_, bufLength, NULL, buf); ELOG("Could not link program:\n %s", buf); // We've thrown out the source at this point. Might want to do something about that. #ifdef _WIN32 OutputDebugStringUTF8(buf); #endif delete[] buf; } return false; } // Auto-initialize samplers. glUseProgram(program_); for (int i = 0; i < 4; i++) { char temp[256]; sprintf(temp, "Sampler%i", i); int samplerLoc = GetUniformLoc(temp); if (samplerLoc != -1) { glUniform1i(samplerLoc, i); } } // Here we could (using glGetAttribLocation) save a bitmask about which pieces of vertex data are used in the shader // and then AND it with the vertex format bitmask later... return true; }
UniformState* IProgramObject::GetNewUniformState(const std::string name) { const size_t hash = hashString(name.c_str()); const auto it = uniformStates.emplace(hash, name); UniformState* us = &(it.first->second); us->SetLocation(GetUniformLoc(name)); #if DEBUG if (us->IsLocationValid()) us->SetType(GetUniformType(us->GetLocation())); // make sure hash is unique for (const auto us2: uniformStates) assert(us2.first != hash || us2.second.GetName() == name); #endif return us; }