我正在编写一个简单的OpenGL应用程序,它具有使用片段着色器更改网格颜色的功能。但是,用于定期更改颜色(uniform float time
)的sin(time)
变量由于某种原因无法正常运行。
此外,整个网格填充为白色...编辑:我只是忘了绑定当前的shaderProgram。没有做任何事情的统一浮点时间变量仍然没有修复......
PaintGL
代码:
void OpenGLWidget::paintGL() {
static unsigned int frame = 0;
vao->bind();
shaders->link();
shaders->bind();
// Enabling custom shader atttributes
int timeIndex = shaders->uniformLocation("time");
qDebug() << "Time index:" << timeIndex;
shaders->setUniformValue(timeIndex, time->elapsed());
shaders->link();
qDebug() << "Frame " << frame << "| created = " << elems->isCreated() << "| time = " << time->elapsed()/1000.f;
glDrawElements(GL_TRIANGLE_FAN, rawelems.size(), GL_UNSIGNED_INT, 0);
vao->release();
++frame;
}
片段着色器:
#version 330 core
uniform float time;
out vec3 color;
void main() {
color = vec3( sin(time), 1.0f, 0.0f );
}
注意我省略了用于放置顶点的“顶点”顶点着色器属性 - 也占用了索引0,我不确定这是否是问题,即使它是如何解决它。
qDebug输出(或者其中一些输出):
TimeINDEX: 0
Shader compilation log: ""
Time index: 0
Frame 0 | created = true | time = 0.268
Time index: 0
Frame 1 | created = true | time = 0.372
Time index: 0
Frame 2 | created = true | time = 0.44
...
我想知道问题是否可能是因为我在shader
QOpenGLShaderProgram对象中加载了顶点和片段着色器,但在这个阶段我只能在一般方向上猜测
答案 0 :(得分:1)
原来问题在于:
shaders->link();
之后
shaders->setUniformValue(timeIndex, time->elapsed());
一旦我删除了link()函数调用,一切都正常运行。