gpt4 book ai didi

c++ - glGetActiveUniform 报告制服存在,但 glGetUniformLocation 返回 -1

转载 作者:太空狗 更新时间:2023-10-29 20:37:12 25 4
gpt4 key购买 nike

我有一个顶点着色器,由于某种原因我无法获得其中一件制服的位置。

我使用 glGetActiveUniform 获取所有可用的制服,我的制服就在那里 (bones[0])。

但是,当我调用 glGetUniformLocation(shaderProgram_, "bones[0]"); 时,它返回 -1。

我也试过 glGetUniformLocation(shaderProgram_, "bones");,但它也返回 -1。

这是着色器:

#version 330 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
uniform mat4 pvmMatrix;
uniform mat3 normalMatrix;

layout (std140) uniform Bones
{
mat4 bones[100];
};

layout (location = 0) in vec3 position;
layout (location = 1) in vec4 color;
layout (location = 2) in vec3 normal;
layout (location = 3) in vec2 textureCoordinate;
layout (location = 4) in ivec4 boneIds;
layout (location = 5) in vec4 boneWeights;

out vec4 ourColor;
out vec2 texCoord;
out vec3 normalDirection;

void main()
{
mat4 bones2[100];
for(int i=0;i<100;++i)
{
bones2[i] = mat4(1.0);
}

// Calculate the transformation on the vertex position based on the bone weightings
mat4 boneTransform = bones2[ boneIds[0] ] * boneWeights[0];
boneTransform += bones2[ boneIds[1] ] * boneWeights[1];
boneTransform += bones2[ boneIds[2] ] * boneWeights[2];
boneTransform += bones2[ boneIds[3] ] * boneWeights[3];

//mat4 tempM = mat4(1.0);
//boneTransform = tempM;

// This is for animating the model
vec4 tempPosition = boneTransform * vec4(position, 1.0);
gl_Position = pvmMatrix * tempPosition;

float sum = boneWeights[0] + boneWeights[1] + boneWeights[2] + boneWeights[3];
if (sum > 1.01f)
gl_Position = pvmMatrix * vec4(position, 1.0);
else if (sum < 0.99f)
gl_Position = pvmMatrix * vec4(position, 1.0);

/*
if (boneIds[0] > 99 || boneIds[0] < 0)
gl_Position = pvmMatrix * vec4(position, 1.0);
else if (boneIds[1] > 99 || boneIds[1] < 0)
gl_Position = pvmMatrix * vec4(position, 1.0);
else if (boneIds[2] > 99 || boneIds[2] < 0)
gl_Position = pvmMatrix * vec4(position, 1.0);
else if (boneIds[3] > 99 || boneIds[3] < 0)
gl_Position = pvmMatrix * vec4(position, 1.0);
*/
// Calculate normal
vec4 normalDirTemp = boneTransform * vec4(normal, 0.0);
normalDirection = normalize(normalMatrix * normalDirTemp.xyz);

//gl_Position = vec4(position, 1.0);
//gl_Position = pvmMatrix * vec4(position, 1.0);
ourColor = color;
texCoord = textureCoordinate;

for(int i=0;i<100;++i)
{
if (bones[1] == mat4(0.0))
ourColor = vec4(0.0, 0.0, 1.0, 1.0);
}
}

我还尝试在我的着色器中使用 uniform mat4 bones[100];确实给我统一位置 (0),但是,所有数据都是mat4(0.0),即使我正在将数据推送到 uniform。

有人有什么想法吗?

最佳答案

制服 block 中的制服没有位置。您通过 binding a buffer object 设置它们的值到该 block 的适当绑定(bind)索引。这就是将制服放入 interface blocks 的全部意义所在.

关于c++ - glGetActiveUniform 报告制服存在,但 glGetUniformLocation 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35690994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com