2013-10-13 60 views
0

我正在编写自己的GLSL着色器,并希望有平滑的着色。当我计算法线发送给VBO的时候,阴影起作用了,但是这里的问题是当我使用骨骼元素实现动画时,法线不是正确的。计算法线几何着色器

我正在使用几何着色器来计算法线,但我无法找出如何平滑它们。

这里是我的几何着色器:

#version 150 

layout(triangles) in; 
layout (triangle_strip, max_vertices=3) out; 

in vec2 texCoord0[3]; 
in vec3 worldPos0[3]; 

out vec2 texCoord1; 
out vec3 normal1; 
out vec3 worldPos1; 

void main() 
{ 

     vec3 n = cross(worldPos0[1].xyz-worldPos0[0].xyz, worldPos0[2].xyz-worldPos0[0].xyz); 
     for(int i = 0; i < gl_in.length(); i++) 
     { 
      gl_Position = gl_in[i].gl_Position; 

      texCoord1 = texCoord0; 
      normal1 = n; 
      worldPos1 = worldPos0; 

      EmitVertex(); 
     } 
} 

我下一步需要,我计算了法线脸脸,但我不知道如何得到它们。

+0

你需要重新计算每帧的法线吗? – fen

+0

法线是否需要单位长度?即*归一化*? –

+0

你为什么在几何着色器中执行骨架构造?摆姿势通常在顶点着色器中完成。 – datenwolf

回答

2

OpenGL中的几何着色器只能访问单个三角形而不是整个网格,所以法线必须从单个三角形计算。

这个问题的通常解决方案是为每个顶点计算一次法线并将它们存储在顶点数组中以便于访问。事实证明,这更快更简单,因为您不需要重新计算着色器中的任何内容。

+2

有[相邻原始类型](http://www.opengl.org/wiki/Primitive#Adjacency_Primitives)允许几何着色器访问相邻线/三角形的顶点(此信息从索引流中拉出,所以如果你不使用'glDrawElements(...)'它不会按预期工作)。如果您使用这些基本类型和适当的索引之一,那么可以这样做,但是您指出非参数几何的更简单的解决方案是提前完成此操作。 –

+0

我知道我可以通过triangles_adjacent访问邻居,但是我没有得到的是我如何在glDrawElements中使用GL32.GL_TRIANGLES_ADJACENT作为绘制类型时设置elementbuffer和vertexbuffer。 – CoderCloud