2013-10-13 1 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)이 있습니다 (이 정보는 인덱스 스트림에서 가져 오므로 if 'glDrawElements (...) '를 사용하지 않으면 예상대로 작동하지 않습니다. 이러한 기본 유형과 적절한 색인 중 하나를 사용하면 가능하지만 비 파라 메트릭 지오메트리에 대한 간단한 해결책은 미리 수행하는 것입니다. –

+0

나는 triangle_adjacent와 함께 이웃들에 접근 할 수 있다는 것을 알고 있지만 glDrawElements에서 draw 타입으로 GL32.GL_TRIANGLES_ADJACENT를 사용할 때 elementbuffer와 vertexbuffer를 어떻게 설정해야하는지 알지 못한다. – CoderCloud