加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 无法找到GLSL着色器统一位置

发布时间:2020-12-16 06:53:39 所属栏目:百科 来源:网络整理
导读:我正在使用顶点蒙皮着色器,由于某种原因,我的程序无法找到统一的位置. 顶点着色器代码: #version 330const int MAX_JOINTS = 30;const int MAX_WEIGHTS = 3;in vec3 position;in vec2 textureCoords;in vec3 normal;in ivec3 boneIndices;in vec3 weights;o
我正在使用顶点蒙皮着色器,由于某种原因,我的程序无法找到统一的位置.

顶点着色器代码:

#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 = projectionMatrix * viewMatrix * modelMatrix * vec4(position,1)我得到了预期的结果(没有任何顶点蒙皮的正确渲染),所以尽管它告诉我他们没有,但其他变换似乎仍在工作存在?
????编辑:这有时是这种情况,有时候我将模型放在位置(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:我刚注意到当我从场景中添加或删除对象(使用不同的着色器)时,着色器的行为会发生变化.我不知道该怎么做.
编辑3:如果我从场景中删除所有其他网格,则着色器会因访问冲突而崩溃.只要渲染另一个对象,当前就没有崩溃.
另一个编辑:显然访问权重变量崩溃了我的着色器.

解决方法

我正在阅读这篇关于顶点蒙皮着色器的快速教程: khronos并且它似乎使用了稍微旧版本的GLSL,他们如何提及MVP矩阵的乘法(模型视图proj矩阵)或在你的情况下PVM矩阵(项目视图模型矩阵),在你的情况下使用vec4作为总位置并将其存储回gl_Position,并且他们声称w可能并不总是具有值1,所以为了安全起见他们建议这样做而且我’我将使用您的代码作为示例来解决这个可能的问题.

改变这个:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;

对此:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(totalLocalPos.xyz,1.0);

看看这是否有助于你.我不知道这是否是你问题的原因,但是从你所展示的你的着色器看起来除了那个之外似乎还可以.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读