找不到 GLSL 着色器统一位置
GLSL shader uniform locations can't be found
我正在研究顶点蒙皮着色器,由于某种原因,我的程序找不到统一位置。
顶点着色器代码:
#version 330
const int MAX_JOINTS = 30;
const int MAX_WEIGHTS = 3;
in vec3 position;
in vec2 textureCoords;
in vec3 normal;
in ivec3 boneIndices;
in vec3 weights;
out vec4 fragPos;
out vec3 n;
out vec2 texCoords;
out vec4 mcolor;
uniform mat4 modelMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 normalMatrix;
uniform mat4[MAX_JOINTS] boneTransforms;
void main() {
vec4 totalLocalPos = vec4(0.0);
vec4 totalNormal = vec4(0.0);
for(int i = 0; i < 3; i++){
mat4 boneTransform = boneTransforms[boneIndices[i]];
vec4 posePosition = boneTransform * vec4(position, 1);
totalLocalPos += posePosition * weights[i];
vec4 worldNormal = boneTransform * vec4(normal, 1);
totalNormal += worldNormal * weights[i];
}
texCoords = textureCoords;
fragPos = modelMatrix * vec4(position,1);
n = totalNormal.xyz;
gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;
}
boneTransforms制服似乎设置不正确;如果我查询活动制服
GLint uniforms;
glGetProgramiv(shaderProgramID, GL_ACTIVE_UNIFORMS, &uniforms);
for (int i = 0; i < uniforms; i++){
int name_len = -1, num = -1;
GLenum type = GL_ZERO;
char name[100];
glGetActiveUniform(shaderProgramID, GLuint(i), sizeof(name) - 1,
&name_len, &num, &type, name);
name[name_len] = 0;
}
我总是得到零;但是,如果我只是输入 gl_Position = 投影矩阵 * 视图矩阵 * 模型矩阵 * vec4(position,1),我得到了预期的结果(没有任何顶点皮肤的正确渲染),所以其他转换似乎正在工作,尽管它告诉我它们不存在? 编辑:有时是这种情况,有时我会在位置(0,0,0)获得模型,但除此之外,它就可以正确渲染。
我已经读过编译器剥离未使用/不活动的制服,但是如果我使用 boneTransforms 来计算 totalLocalPos 并将其用于gl_Positions制服应该是活动的。
我尝试设置制服
vector<glm::mat4> boneTransforms = model.getBoneTransforms();
int location = glGetUniformLocation(shaderProgramID, "boneTransforms");
glUniformMatrix4fv(location, boneTransforms.size(), false, (GLfloat*)&boneTransforms);
位置始终为 -1。 我尝试设置这种特定制服的方式是否有问题,还是着色器代码中的错误?
EDIT2:我刚刚注意到,当我从场景中添加或删除对象(使用不同的着色器)时,着色器的行为会发生变化。我不知道该怎么做。
EDIT3:如果我从场景中删除所有其他网格,着色器会崩溃并违反访问。只要渲染另一个对象,当前就不会崩溃。
另一个编辑:显然访问权重变量会使我的着色器崩溃。
我正在阅读这个关于顶点皮肤着色器的快速教程,在这里找到:khronos,它似乎正在使用稍旧版本的 GLSL,他们如何提到 MVP 矩阵(模型视图 proj 矩阵)的乘法,或者在您的情况下,PVM 矩阵( proj 视图模型矩阵)与 vec4 在您的情况下用于总位置并将其存储回gl_Position
他们声称w
可能并不总是具有1
的值,因此为了安全起见,他们建议改为这样做,我将使用您的代码作为他们的例子来解决这个可能的问题。
更改此设置:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;
对此:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(totalLocalPos.xyz, 1.0);
看看这是否对您有帮助。我不知道这是否是导致您问题的原因,但从您显示的内容来看,您的着色器似乎还可以。
我看到您将 mat4 推入着色器的方式有点不对劲。当我做"glUniformMatrix4fv"时,我说第一个参数是着色器的ID,你从"glCreateProgram()"获得的ID。第二个是着色器中变量的名称,因此在您的情况下为"boneTransforms"。第三个是"1"。第四,我把"GL_FALSE"而不是"假",但我认为这应该不会有什么不同。接下来是 mat4 的第一个浮点数,看起来更像这样:&boneTransforms[0][0]
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 找不到 GLSL 着色器统一位置
- 使用 GLSL 直接从着色器中的位置计算转换矩阵
- GLSL属性位置返回-1
- GLSL-GLSL 1.2中的统一位置和着色器中的深度测试
- GLSL-调用的顶点和片段的时间和位置
- GLSL - 程序链接错误:插槽 0 在布局位置请求中不可用
- 将位置写入纹理OpenGL/GLSL
- 如何使用glsl改变顶点位置