Привет всем! Копаюсь с OpenGL 4.3 из-под QT5.4. Возникла проблема с передачей значения в uniform-переменную вершинного шейдера. Изначально хотел передать матрицу, поиграться с видом, но не взошло. Код ниже. Стал разбираться. Вместо матрицы просто объявил в вертексном шейдере uniform int scale. На неё умножаю выходные координаты вершины (просто чтоб было видно результат). Выяснил, что проблема - при вычислении индекса переменной шейдера (дальше, в PaintGL()). glGetUniformLocation для этой переменной возвращает -1. В чём причина? Переменная в шейдере как-то не так объявлена? Подскажите, кто знает, куда копать дальше.
Код:
void OpenGLWindow::initializeGL() {
//Здесь инициализируем рендер. Устанавливаем цвет очистки окна и текущий цвет рендера.
funcs->glClearColor(0,0,0,1);
funcs->glColor4f(1.0, 0.0, 0.0, 1.0);
//Здесь же создаются и компилируются 2 шейдера - Vertex-шейдер и Fragment-шейдер.
const char *vertexShader =
"#version 400\n"
"in vec3 position;"
"in vec3 color;"
"uniform int scale;"
"out vec3 fragmentColor;"
"void main (void) {"
" gl_Position = vec4(position.x*scale, position.y*scale, position.z*scale, 1.0);"
" fragmentColor = color;"
"}";
const char *fragmentShader =
"#version 400\n"
"in vec3 fragmentColor;"
"out vec4 Colour;"
"void main() {"
" Colour = vec4(fragmentColor, 1.0);"
"}";
//Создание шейдерной программы происходит в несколько этапов:
//Создаём Vertex-шейдер и получаем его ID (int-значение) для дальнейшей работы с ним
vsID = funcs->glCreateShader(GL_VERTEX_SHADER);
//Указываем шейдеру его исходный код
funcs->glShaderSource(vsID, 1, &vertexShader, NULL);
//Компилируем шейдер
funcs->glCompileShader(vsID);
//То же самое для Fragment-шейдера
fsID = funcs->glCreateShader(GL_FRAGMENT_SHADER);
funcs->glShaderSource(fsID, 1, &fragmentShader, NULL);
funcs->glCompileShader(fsID);
//Получаем отладочную информацию по компиляции (реализация ниже)
compileReport();
}
void OpenGLWindow::paintGL() {
GLuint shaderProgramm = funcs->glCreateProgram();
funcs->glAttachShader(shaderProgramm, vsID);
funcs->glAttachShader(shaderProgramm, fsID);
funcs->glLinkProgram(shaderProgramm);
float vertices[60] = {0.0f, 0.0f,0.0f, 0.0f,0.0f,1.0f,
0.0f, 1.0f,0.0f, 1.0f,0.0f,0.0f,
0.7f, 0.7f,0.0f, 0.0f,1.0f,0.0f,
1.0f, 0.0f,0.0f, 0.0f,0.0f,1.0f,
0.7f,-0.7f,0.0f, 1.0f,0.0f,0.0f,
0.0f,-1.0f,0.0f, 0.0f,1.0f,0.0f,
-0.7f,-0.7f,0.0f, 0.0f,0.0f,1.0f,
-1.0f, 0.0f,0.0f, 1.0f,0.0f,0.0f,
-0.7f, 0.7f,0.0f, 0.0f,0.1f,0.0f,
0.0f, 1.0f,0.0f, 1.0f,0.0f,0.0f};
GLuint vboID, vaoID, positionID, colorID, scaleID;
positionID = funcs->glGetAttribLocation(shaderProgramm, "position");
colorID = funcs->glGetAttribLocation(shaderProgramm, "color");
scaleID = funcs->glGetUniformLocation(shaderProgramm, "scale");
qDebug() << positionID << "pos\n" << colorID << "col\n" << scaleID << "scale\n";
funcs->glGenBuffers(1, &vboID);
funcs->glBindBuffer(GL_ARRAY_BUFFER, vboID);
funcs->glBufferData(GL_ARRAY_BUFFER, 60*sizeof(float), vertices, GL_STATIC_DRAW);
funcs->glBindBuffer(GL_ARRAY_BUFFER, 0);
funcs->glGenVertexArrays(1, &vaoID);
funcs->glBindVertexArray(vaoID);
funcs->glBindBuffer(GL_ARRAY_BUFFER, vboID);
funcs->glVertexAttribPointer(positionID, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (const GLvoid*)0);
funcs->glEnableVertexAttribArray(positionID);
funcs->glVertexAttribPointer(colorID, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (const GLvoid*)12);
funcs->glEnableVertexAttribArray(colorID);
funcs->glBindVertexArray(0);
funcs->glUseProgram(shaderProgramm);
funcs->glBindVertexArray(vaoID);
funcs->glDrawArrays(GL_TRIANGLE_FAN, 0, 10);
funcs->glDeleteVertexArrays(1, &vaoID);
}