- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 this minimal example 的稍微修改过的版本让我的 OpenGL 代码(在 Qt 5.2.0 中)与 Oculus HMD 一起工作。相关部分我没有改动。
然而,在gl_uniform_2f/4f/1i函数中调用glGetUniformLocation
总是给出glError GL_INVALID_VALUE
(肯定是这个调用,我用了很多glGetError
调用以找到它)。
我之前读到,尝试在不同的线程中执行这样的操作可能会导致问题,但我没有使用线程(据我所知,无论如何)。
着色器程序编译/链接没有任何问题,所以这也不应该是问题。
到目前为止,我尝试的一切都没有帮助,而且由于我对着色器相当缺乏经验,也许有人可以很容易地看出问题。
编辑:在验证着色器程序之后
glValidateProgram(gl_fragment_shader_program);
glGetProgramiv(gl_fragment_shader_program, GL_VALIDATE_STATUS, &Result);
glGetProgramiv(gl_fragment_shader_program, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ProgramErrorMessage(InfoLogLength+1);
glGetProgramInfoLog(gl_fragment_shader_program, InfoLogLength, NULL, &ProgramErrorMessage[0]);
qDebug() << &ProgramErrorMessage[0];
结果是
Validation warning! - Sampler value texture0 has not been set.
Validation successful.
因为我在别处读到这个警告通常可以被忽略,所以我没有多想。
edit2:好的,我现在意识到必须在 glDraw()
调用之前验证程序。在这种情况下,警告消失了,但原始问题中的 GL_INVALID_VALUE
错误仍然存在。
最佳答案
经过大量挖掘,我发现我的一个函数将着色器程序等的 GLuint 句柄初始化为 0,它在 QGLWidget::initializeGL()
调用之后被调用。所以这毕竟不是真正的 openGL 问题,我只是当前没有绑定(bind)正确的着色器程序。
我希望这对那些可能使用 Qt 和 openGL 但目前还不太熟悉的人(比如我)有所帮助。
关于c++ - glGetUniformLocation 给出 glError : GL_INVALID_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066181/
我有一个 OpenGL 应用程序,它使用着色器和顶点缓冲区对象,以及用于矩阵和 vector 的 GLM。因为每一帧都会发生矩阵变换,所以我每帧都调用 glUniformMatrix4fv() 。下面
我们有几个不同的 opengles2.0 着色器,每个着色器都使用不同的制服。我们使用 glGetUniformLocation 来获取为每个制服写入数据的位置。然而,这意味着当我们切换着色器程序时,
我有一个包含多个灯光的着色器,我想获得每个灯光属性的统一位置,而不必为每个灯光手动输入。但是,由于 glGetUniformLocation 使用字符串查找制服,我不能那样做。 for (unsign
几天前我找到了 Gwen,并认为它看起来是我项目的完美 GUI 工具包。但是,亲爱的,看看渲染器中的所有 OpenGL 2 代码。所以我想我会写一个 OpenGL 3 渲染器,这样我就可以实际使用它,
在为着色器设置任何统一参数之前,我正在使用 glGetUniformLocation 检索其位置,而不是在开始时执行一次并存储 int 位置值。像这样:: const int location = g
我一直在用 OpenGL 开发一些应用程序。在第一遍中,我将一些值写入我的 FBO,它附加了 3 种颜色纹理。在第二遍中,我将这 3 个纹理附加为着色器中的采样器,并对颜色进行一些计算。以下是第二遍的
使用 Radeon 3870HD 我遇到了 AMD 驱动程序的奇怪行为(昨天更新到可用的最新版本)。 首先,我想指出整个代码在 NVIDIA GeForce 540M 上运行没有问题,而且 glGet
我想在我的顶点着色器中设置一个统一的 vector 。 int loc = glGetUniformLocation(shader, "LightPos"); if (loc != -1) {
我正在尝试渲染一个带有法线的简单立方体。我正在使用以下代码来初始化着色器。 void initShader(const char* vertexShaderPath, const char* frag
我使用的是 this minimal example 的稍微修改过的版本让我的 OpenGL 代码(在 Qt 5.2.0 中)与 Oculus HMD 一起工作。相关部分我没有改动。 然而,在gl_u
似乎glsl 编译器优化了未使用的变量(删除)。在我的例子中,我使用了变量,但 glGetUniformLocation 返回 -1 rgbScene.addRenderStage( [&ob
在 DirectX 11 中是否有等效于 glGetUniformLocation 的等效项? 如果不是,您如何在代码中处理着色器?手动设置每个布局都不好笑,而且很容易出错。为了处理这个问题,我创建了
当我查看 OpenGL 4.5 规范时,我注意到您可以通过调用以下命令获取制服的位置: glGetProgramResourceLocation(program, GL_UNIFORM, name);
我在 GLSL 中定义了一个结构,如下所示: struct Rect { float x; float y; float width; float height; };
我一直在运行 glGetUnfiormLocation 调用时遇到问题。在运行 ATI 显卡的学校计算机上构建项目时,该程序运行完美。然而,使用运行 nvidia 卡的学校计算机,对 glGetUni
据我所知,如果某个uniform变量没有主动贡献管道的输出,它就会被优化并且应该返回-1。考虑下面的片段着色器。 const char fShader[] = "precision mediump
我找不到在 Linux 下编译以下测试代码的方法(为 Mac 开发的程序的一部分) #include void test(){ const char *name GLint uni_l
我有一个具有以下属性的片段着色器: varying highp vec2 coordinate; precision mediump float; uniform sampler2D videofra
我试图将我的 GL 调用包装在外部函数和类中。因此,这提出了为我的着色器设置制服的问题:glGetUniformLocation 是一个缓慢的操作吗?如果是这样,使用 std::map 存储由字符串中
我有一个顶点着色器,由于某种原因我无法获得其中一件制服的位置。 我使用 glGetActiveUniform 获取所有可用的制服,我的制服就在那里 (bones[0])。 但是,当我调用 glGetU
我是一名优秀的程序员,十分优秀!