crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> OpenGL4.3 в Qt5.4 - передача значения в uniform переменную вершинного шейдера.
wf778899
  опции профиля:
сообщение 18.3.2015, 9:23
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет всем! Копаюсь с 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);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 15:52