簡體   English   中英

找不到 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 = projectionMatrix * viewMatrix * modelMatrix * 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矩陣(項目視圖模型矩陣),在你的情況下使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM