60 programId_ = glCreateProgram();
64 bool addShaderFromSource(std::string
const &shaderSource, GLenum shaderType) {
65 char const *shaderCStr = shaderSource.c_str();
66 GLuint shaderId = glCreateShader(shaderType);
68 GLchar
const *files[] = {preamble, shaderCStr};
69 GLint lengths[] = {(GLint)strlen(preamble), (GLint)strlen(shaderCStr)};
71 glShaderSource(shaderId, 2, files, lengths);
73 glCompileShader(shaderId);
74 glGetShaderiv(shaderId, GL_COMPILE_STATUS, &success);
77 glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &logLength);
79 auto log = std::unique_ptr<char[]>(
new char[logLength]);
80 glGetShaderInfoLog(shaderId, logLength, &logLength, log.get());
81 printf(
"ERROR::SHADER::COMPILATION_FAILED\n%s\n", log.get());
82#ifdef USE_ANDROID_GLES2
83 qDebug() <<
"SHADER COMPILE ERROR " << log.get();
84 qDebug() << shaderCStr;
90 glAttachShader(programId_, shaderId);
95 glLinkProgram(programId_);
96 glGetProgramiv(programId_, GL_LINK_STATUS,
98 if (linkSuccess == GL_FALSE) {
100 glGetShaderiv(programId_, GL_INFO_LOG_LENGTH, &logLength);
102 auto log = std::unique_ptr<char[]>(
new char[logLength]);
103 glGetShaderInfoLog(programId_, logLength, &logLength, log.get());
104 printf(
"ERROR::SHADER::LINK_FAILED\n%s\n", log.get());
112 void Bind() { glUseProgram(programId_); }
114 glDisableVertexAttribArray(0);
118 void SetUniform1f(
const std::string &name,
float value) {
119 GLint loc = getUniformLocation(name);
120 glUniform1f(loc, value);
122 void SetUniform2fv(
const std::string &name,
float *value) {
123 GLint loc = getUniformLocation(name);
124 glUniform2fv(loc, 1, value);
126 void SetUniform4fv(
const std::string &name,
float *value) {
127 GLint loc = getUniformLocation(name);
128 glUniform4fv(loc, 1, value);
130 void SetUniform1i(
const std::string &name, GLint value) {
131 GLint loc = getUniformLocation(name);
132 glUniform1i(loc, value);
134 void SetUniformMatrix4fv(
const std::string &name,
float *value) {
135 GLint matloc = getUniformLocation(name);
136 glUniformMatrix4fv(matloc, 1, GL_FALSE, value);
139 void SetAttributePointerf(
const char *name,
float *value) {
140 GLint aloc = glGetAttribLocation(programId_, name);
141 glVertexAttribPointer(aloc, 2, GL_FLOAT, GL_FALSE, 2 *
sizeof(
float),
143 glEnableVertexAttribArray(aloc);
146 glBindBuffer(GL_ARRAY_BUFFER, 0);
147 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
150 GLuint programId()
const {
return programId_; }
151 bool isOK()
const {
return linked_; }
154 std::unordered_map<std::string, GLint> m_uniformLocationCache;
160 GLint getUniformLocation(
const std::string &name) {
161 if (m_uniformLocationCache.find(name) != m_uniformLocationCache.end())
162 return m_uniformLocationCache[name];
164 GLint loc = glGetUniformLocation(programId_, name.c_str());
165 m_uniformLocationCache[name] = loc;