找不到 GLSL 着色器统一位置

GLSL shader uniform locations can't be found

本文关键字:位置 GLSL 找不到      更新时间:2023-10-16

我正在研究顶点蒙皮着色器,由于某种原因,我的程序找不到统一位置。

顶点着色器代码:

#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]