无法在 OpenGL 着色器中设置统一值
Can't set uniform value in OpenGL shader
我正在尝试让简单的着色器工作。更具体地说,我正在尝试设置着色器的统一值。着色器成功编译并在我消除统一值时正常工作。下面是(顶点)着色器代码:
#version 440 core
layout(location = 0) in vec3 vertex;
uniform mat4 mvp;
void main()
{
gl_Position = mvp * vec4(vertex, 1);
}
以及我用来设置值的代码(glGetUniformLocation
按预期返回 0):
mvp = glm::mat4(
glm::vec4(3.0f, 0.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 1.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 1.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 0.0f, 2.0f)
);
GLuint matrix = glGetUniformLocation(program, "mvp");
glUniformMatrix4fv(matrix, 1, GL_FALSE, glm::value_ptr(mvp));
问题是它似乎根本没有设置值。如果我使用 glGetUniformfv
查询制服的值,它会返回默认值(不是我刚刚设置的值),并且几何形状根本不显示(但这只是一个结果,这不是这里的问题)。
如果我在着色器中对制服的值进行硬编码,应用程序会正确显示几何图形,并且在要求输入值(再次使用 glGetUniformfv
)时,它会返回正确的值。
#version 440 core
layout(location = 0) in vec3 vertex;
uniform mat4 mvp = mat4(
vec4(1.0f, 0.0f, 0.0f, 0.0f),
vec4(0.0f, 1.0f, 0.0f, 0.0f),
vec4(0.0f, 0.0f, 1.0f, 0.0f),
vec4(0.0f, 0.0f, 0.0f, 2.0f)
);
void main()
{
gl_Position = mvp * vec4(vertex, 1);
}
知道为什么会这样吗?我使用的是 OpenGL 4.4,但我尝试了许多不同的版本,结果相同。
你在设置制服之前打电话给glUseProgram
吗?完整的工作列表可以在许多在线示例中找到,包括我不久前写的内容(Github:sgxperf/sgxperf_gles20_vg.cpp
),其中显示序列为:
glCreateProgram() glAttachShader() glLinkProgram() glUseProgram() glGetUniformLocation() glUniformMatrix4fv()
相关文章:
- 如何在glfw中为OpenGL设置核心配置文件上下文?
- 了解现代OpenGL中的代码绘图.OBJ并设置不同的位置
- 使用Visual Studio Code和CMake调试OpenGL(使用GLEW&GLFW),无法设置断点
- 在Visual Studio 2017中设置OpenGL
- 设置OpenGL FBO以渲染Cubemap深度纹理时,为什么我会得到不完整的附件
- 在 Mac OS X 上使用 CGL 设置 OpenGL 上下文
- 如何设置 OpenGL 版本
- 在 Windows 上设置 OpenGL 库
- 在闪存驱动器上为 Windows C++ Code blocks设置 OpenGL
- 在窗口中的 NetBeans 上设置 OpenGL
- 如何在c++中使用XCode 4.2设置OpenGL项目?
- 为多个显示器设置OpenGL
- 设置 OpenGL - 它不起作用
- 设置OpenGL绘图的坐标系统
- 设置OpenGL中窗口的大小
- 设置opengl视图和投影转换
- 设置OpenGL时遇到问题
- 如何使用GLM设置OpenGL/C++项目
- QOpenGLWidget在Qt中设置OpenGL
- 在Ubuntu上使用GLFW设置OpenGL NetBeans项目