2013-10-13 4 views
0

В настоящее время я пишу свои собственные шейдеры GLSL и хочу иметь плавное затенение. Затенение работало, когда я вычислял нормали, отправляя их в VBO, но проблема здесь в том, что я реализую анимацию с костяными матрицами, нормали не являются корнями.Calculate Normals Geometry Shader

Я использую геометрический шейдер для вычисления нормалей, но я не знаю, как сгладить их.

Вот мой геометрический шейдер:

#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

Я знаю, что я могу получить доступ к соседям с треугольниками_адженю, но то, что я не получаю, - это то, как я должен настроить элементбуфер и vertexbuffer, когда я использую GL32.GL_TRIANGLES_ADJACENT как тип draw в glDrawElements. – CoderCloud

Смежные вопросы