glsl顶点着色器统一变量未被激活
glsl vertex shader uniform variable not getting activated
我一直在尝试将 mat4 传递到 VS 中。
我在传递数据之前激活着色器程序:
renderProg.use(); // glUseProgram( m_programHandle );
glm::mat4 mv = view * model;
renderProg.setUniform("u_ModelViewMatrix", mv);
renderProg.setUniform("u_MVP", projection * mv);
但由于某种原因统一变量 (u_ModelViewMatrix) 未被激活并在 glGetUniformLocation
的“位置”中返回 -1。这是 VS 代码:
#version 460
layout (location = 0 ) in vec3 VertexPosition;
uniform mat4 u_MVP;
uniform mat4 u_ModelViewMatrix;
out vec3 Position;
void main()
{
vec4 vp = vec4(VertexPosition, 1.0);
Position = (u_ModelViewMatrix * vp).xyz;
gl_Position = u_MVP * vp;
}
FS代码:
#version 460
in vec3 Position;
uniform vec4 Color;
layout( location = 0 ) out vec4 FragColor;
void main() {
FragColor = Color;
}
只有一个制服无法设置“u_ModelViewMatrix”,另一个正在成功访问“u_MVP”。两种制服使用相同的调用来接收数据:
glUniformMatrix4fv(loc, 1, GL_FALSE, &m[0][0]);
在成功链接和编译 Vertex 和 Fragment 着色器之后,如果我正在查询活动制服,它会返回两个制服位置,一个来自 FS“Color "另一个来自VS"u_MVP"
for( int i = 0; i < nUniforms; ++i ) {
glGetActiveUniform( m_programHandle, i, maxLen, &written, &size, &type, name );
location = glGetUniformLocation(m_programHandle, name);
qDebug() << "Location: " << location << " Name: " << name;
}
输出:
位置:0 名称:颜色
位置:1 姓名:u_MVP
我做错了什么?
片段着色器中未使用接口变量 Position
。所以统一变量 u_ModelViewMatrix
不是必需的。该制服被链接器“优化掉”,不会成为活动的程序资源。因此,您不会获得 "u_ModelViewMatrix"
.
的统一位置
我一直在尝试将 mat4 传递到 VS 中。 我在传递数据之前激活着色器程序:
renderProg.use(); // glUseProgram( m_programHandle );
glm::mat4 mv = view * model;
renderProg.setUniform("u_ModelViewMatrix", mv);
renderProg.setUniform("u_MVP", projection * mv);
但由于某种原因统一变量 (u_ModelViewMatrix) 未被激活并在 glGetUniformLocation
的“位置”中返回 -1。这是 VS 代码:
#version 460
layout (location = 0 ) in vec3 VertexPosition;
uniform mat4 u_MVP;
uniform mat4 u_ModelViewMatrix;
out vec3 Position;
void main()
{
vec4 vp = vec4(VertexPosition, 1.0);
Position = (u_ModelViewMatrix * vp).xyz;
gl_Position = u_MVP * vp;
}
FS代码:
#version 460
in vec3 Position;
uniform vec4 Color;
layout( location = 0 ) out vec4 FragColor;
void main() {
FragColor = Color;
}
只有一个制服无法设置“u_ModelViewMatrix”,另一个正在成功访问“u_MVP”。两种制服使用相同的调用来接收数据:
glUniformMatrix4fv(loc, 1, GL_FALSE, &m[0][0]);
在成功链接和编译 Vertex 和 Fragment 着色器之后,如果我正在查询活动制服,它会返回两个制服位置,一个来自 FS“Color "另一个来自VS"u_MVP"
for( int i = 0; i < nUniforms; ++i ) {
glGetActiveUniform( m_programHandle, i, maxLen, &written, &size, &type, name );
location = glGetUniformLocation(m_programHandle, name);
qDebug() << "Location: " << location << " Name: " << name;
}
输出: 位置:0 名称:颜色 位置:1 姓名:u_MVP
我做错了什么?
片段着色器中未使用接口变量 Position
。所以统一变量 u_ModelViewMatrix
不是必需的。该制服被链接器“优化掉”,不会成为活动的程序资源。因此,您不会获得 "u_ModelViewMatrix"
.