C++ (Qt)void SetUniformFloat( QOpenGLShaderProgram * shader, const char * name, float value ){ int loc = shader->uniformLocation(name); Q_ASSERT(loc >= 0); shader->setUniformValue(loc, value);}
C++ (Qt)SetUniformFloat(shader, "diffuse", 0.5f); // переменнаяSetUniformFloat(shader, "color[0]", 0.5f); // массивSetUniformFloat(shader, "light[1].amout", 0.5f); // массив структур
C++ (Qt)QHash<std::string, QPair<int, float>> mHash;
C++ (Qt)SetUniformIntSetUniformFloatSetUniformVector3DSetUniformVector4DSetUniformMatrix3x3SetUniformMatrix4x4
C++ (Qt)QHash<const char *, QPair<int, QVariant>> mHash;
C++ (Qt)static const std::string u_diffuse("diffuse");...auto & data = mHash[u_diffuse.c_str()];
C++ (Qt)std::string str("diffuse");......mHash[str.c_str()]...
но есть и по 1-2К строк
отделаться членами класса для хранения location не удается
C++ (Qt)struct MyShader : public QOpenGLShaderProgrram { void SetUniform( const char * name, // uniform or struct field name const QVariant & value, // value to set const char * structName = 0, // struct or array name int structIndex = -1 ); // array index };
C++ (Qt)shader->SetUniform("diffuse", QVariant(0.5f)); // установка uniform с именем "diffuse"shader->SetUniform("amout", QVariant(0.5f), "light", 1); // установка "light[1].amout"
Locations { int diffuse = -1; vector<int>light;}
struct Light { int type; vec4 viewPosition; vec3 amount; vec3 specular; float coneInner; float spotCosCutoff; vec3 spotDirection; float spotExponent; float dropoffDist; float dropoffOver;};
Locations { vector<LightLocations> light
C++ (Qt)void SetUniform( const char * name, // uniform or struct field name const QVariant & value, // value to set const char * structName = 0, // struct or array name int structIndex = -1 ); // array index