Имеется класс наследник 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",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 использовать просто переменную, все работает как надо... Не могу разобраться в чем проблема. Помогите пожалуйста.