crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблемы с передачей uniform в шейдер, QGLWidget, QGLShaderprogram
Гость_Resett_*
сообщение 4.1.2011, 16:52
Сообщение #1





Гости








    


Имеется класс наследник QGLWidget.
В нем имеется метод, подключающий шейдеры:
void GLView::setupShaders()
{
    if(!QGLShader::hasOpenGLShaders(QGLShader::Vertex))
        QMessageBox::warning(this,"Error!","vertex unsupported",QMessageBox::Ok);
    if(!QGLShader::hasOpenGLShaders(QGLShader::Fragment))
        QMessageBox::warning(this,"Error!","fragment unsupported",QMessageBox::Ok);

    QGLShader *vshader = new QGLShader(QGLShader::Vertex, this);
    vshader->compileSourceFile("./data/fx/diffuse.vert");


    QGLShader *fshader = new QGLShader(QGLShader::Fragment, this);
    fshader->compileSourceFile("./data/fx/diffuse.frag");

    program = new QGLShaderProgram(this);
    program->addShader(vshader);
    program->addShader(fshader);
    program->link();

    const GLfloat lightPos[3] = {5,5,5};
    GLfloat x = 5;
    GLfloat y = 5;
    GLfloat z = 5;

    //program->setUniformValue("lightPos",x,y,z);
    program->setUniformValue("lightPos",QVector3D(lightPos[0],lightPos[1],lightPos[2]));


    program->bind();
}


Код вертексного шейдера куда передается uniform:

#pragma optimize(off)
varying vec3 l;
varying vec3 n;

uniform vec3 lightPos;

void main(void)
{
    gl_FrontColor = gl_Color;
        gl_BackColor = gl_Color;
        
        vec3 lightPos1 = vec3(5.0, 5.0, 5.0);
        
    vec3 p = vec3(gl_Vertex);
    
    l = normalize( lightPos  -   p );
    n = normalize(gl_Normal);
    
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}


В результате работы шейдера получается не то что мне нужно, а именно, позиция источника света получается не известно где.
Но, ели строчку l = normalize( lightPos - p ); заменить на l = normalize( lightPos1 - p );, т.е. вместо uniform использовать просто переменную, все работает как надо... Не могу разобраться в чем проблема. Помогите пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 5.1.2011, 0:51
Сообщение #2





Гости








    


Проблема решена - сначала биндим программу program->bind(); затем модифицируем юниформы. я скрабил =D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 11.3.2025, 10:00