Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 顶点着色器(GLSL)奇怪的行为;不画_Opengl_Animation_Glsl_Shader_Vertex Shader - Fatal编程技术网

Opengl 顶点着色器(GLSL)奇怪的行为;不画

Opengl 顶点着色器(GLSL)奇怪的行为;不画,opengl,animation,glsl,shader,vertex-shader,Opengl,Animation,Glsl,Shader,Vertex Shader,我正在尝试使用顶点着色器实现骨骼动画。我将顶点的索引和权重作为属性传递,在绘制时,我将每个骨骼的动画矩阵作为数组传递给着色器 现在由于某种原因,当我将计算添加到着色器时,我的模型将消失。即使我没有在着色器中的任何位置使用计算结果,它也会导致着色器消失。不会抛出任何错误 我做了很多测试,发现只有当我尝试访问AnimationMatrix时才会发生这种情况[60]。就我所见,任何指数低于60的作品。然而,这是wierd,因为我的模型中只有53块骨头 为了举例说明,以下代码没有绘制任何内容: #ver

我正在尝试使用顶点着色器实现骨骼动画。我将顶点的索引和权重作为属性传递,在绘制时,我将每个骨骼的动画矩阵作为数组传递给着色器

现在由于某种原因,当我将计算添加到着色器时,我的模型将消失。即使我没有在着色器中的任何位置使用计算结果,它也会导致着色器消失。不会抛出任何错误

我做了很多测试,发现只有当我尝试访问AnimationMatrix时才会发生这种情况[60]。就我所见,任何指数低于60的作品。然而,这是wierd,因为我的模型中只有53块骨头

为了举例说明,以下代码没有绘制任何内容:

#version 330


uniform vec3 light = vec3(10,2,8);

uniform mat4 modelmatrix;
uniform mat4[64] animationMatrices;

attribute vec3 a_tangent;
attribute vec4 a_boneIndices;
attribute vec4 a_boneWeights;

out vec3 lightVec;
out vec3 eyeVec;
out vec4 test;

void main()
{   
    vec4 newVert = (animationMatrices[60] * gl_Vertex) * a_boneWeights.x + gl_Vertex;
    vec4 vertPos = modelmatrix * gl_Vertex;
    gl_Position = gl_ModelViewProjectionMatrix * vertPos;
    eyeVec = normalize(-vec3(gl_ModelViewMatrix*vertPos));

    gl_TexCoord[0] = gl_MultiTexCoord0;

//some more stuff here but not important


}
如果我注释掉newVert行,我的模型就会显示出来

因此,如果我删除或注释掉这一行,着色器工作正常(或将索引更改为低于60的值):


只要我重新介绍这一行,就不会再显示任何内容,即使在着色器中的任何位置都没有使用newVert。

假设
modelmatrix
不是单位矩阵,则您的顶点变换不正确

首先从对象空间到世界空间:
vec4 vertPos=modelmatrix*gl_顶点;
然后从(应该是对象空间到剪辑空间:
gl\u位置=gl\u模型视图投影矩阵*vertPos;//vertPos在世界空间中!!!
您需要停止这样做,或者隔离视图和投影矩阵

可能的解决方案:
1。vertPos=gl_顶点;
2.gl_位置=gl_模型视图投影矩阵*gl_顶点;
3.gl_位置=投影矩阵*视图矩阵*顶点位置;

考虑到它下面的几行,您可以计算一个名为
eyeVec
eyeVec=normalize(-vec3(gl_ModelViewMatrix*vertPos));

您可能根本不应该触摸
vertPos
,该着色器正常工作的唯一方法是如果
vertPos
=
gl_顶点
(潜在解决方案#1)。

为什么要添加
a_boneWeights.x+gl_顶点
?据我所知,乘法先于加法,这意味着我首先将原始顶点与动画矩阵相乘,然后将结果向量与权重相乘,并将结果向量与原始向量相加。不过我怀疑这是否有关系。我的着色器在没有这一行的情况下工作得完美无缺。我的modelmatrix只是一个将顶点从局部坐标转换为世界坐标的矩阵(为它们提供偏移/旋转/缩放)。这并不是对我问题的回答,因为着色器的这一部分可以工作。确切地说,如果没有这条线(它会错误地将顶点位置转换为世界空间),那么着色器的工作就完美无缺。您的
modelmatrix
是一个从对象空间转换到世界空间的矩阵,
gl\u ModelViewProjectionMatrix
是一个从对象空间转换到剪辑空间而不是从世界空间转换到剪辑空间的矩阵。你的着色器完全错误。你的另一个问题很简单:64*4*4=1040。1040 > 1024. 您没有足够的均匀组件在顶点着色器阶段中存储64个矩阵。如果需要那么多统一组件,则需要使用统一缓冲区对象。否则,您将被限制为1024个组件(在实际使用所有64个矩阵索引之前,您将超过此限制,因为您与着色器中的其他变量和常量文字等共享统一存储)。最后一条评论是我问题的答案,解决了我的问题,谢谢!很高兴知道。但是数学有点不对劲。。。此着色器中确实需要1040个组件,但这是因为您的模型矩阵具有64个
mat4s
+1
mat4
的数组。我建议您在使用固定函数矩阵堆栈时放弃使用它,如果您必须采用UBOs来解决您的问题,您应该停止使用core GL中不再提供的功能。同时把两个问题扼杀在萌芽状态。事实上,此着色器可能不会在严格的GLSL实现中编译,因为
#version 330
意味着
#version 330 core
,而不是
#version 330兼容性
vec4 newVert = (animationMatrices[60] * gl_Vertex) * a_boneWeights.x + gl_Vertex;