Общий шейдер освещения GLSL

Пиксельное освещение является распространенной проблемой во многих приложениях OpenGL, поскольку стандартное освещение OpenGL имеет очень низкое качество.

Я хочу использовать программу GLSL, чтобы иметь попиксельное освещение в моей программе OpenGL, а не по вершинам. Просто Диффузное освещение, но с туманом, текстурой и текстурой-альфой как минимум.

Я начал с этого шейдера:

texture.vert:

varying vec3 position;
varying vec3 normal; 

void main(void) 
{
  gl_Position       = gl_ModelViewProjectionMatrix * gl_Vertex;
  gl_FrontColor     = gl_Color;
  gl_TexCoord[0]    = gl_MultiTexCoord0; 
  normal        = normalize(gl_NormalMatrix * gl_Normal);
  position      = vec3(gl_ModelViewMatrix * gl_Vertex);
}

texture.frag:

uniform sampler2D Texture0;
uniform int ActiveLights;

varying vec3 position;
varying vec3 normal; 

void main(void) 
{
  vec3 lightDir;
  float  attenFactor;
  vec3 eyeDir           = normalize(-position); // camera is at (0,0,0) in ModelView space
  vec4 lightAmbientDiffuse  = vec4(0.0,0.0,0.0,0.0);
  vec4 lightSpecular        = vec4(0.0,0.0,0.0,0.0);    

  // iterate all lights
  for (int i=0; i

Комментарии на немецком языке, потому что этот код был размещен на немецком сайте, извините.

Но все, что делает этот шейдер, это делает все очень темным. Никаких световых эффектов, но коды шейдеров компилируются.Если я использую только GL_LIGHT0 во фрагментном шейдере, то это, кажется, работает, но разумно только для многоугольников, обращенных к камере, а мой многоугольник пола просто очень темный. Также четырехугольники с текстурами RGBA не демонстрируют признаков прозрачности. Я использую стандартный glRotate/Translate для матрицы Modelview и glVertex/Normal для полигонов. Освещение OpenGL прекрасно работает, за исключением того факта, что оно выглядит некрасиво на очень больших поверхностях. Я трижды проверил свои нормали, они в порядке.

Что-то не так в приведенном выше коде? ИЛИ Скажите мне, почему для этой актуальной задачи нет общего шейдера освещения (точечный свет с уменьшением расстояния: свеча, если хотите) - разве не должен быть только один правильный способ сделать это? Я не хочу выпуклых/нормальных/параллаксных/мультяшных/размытых/каких бы то ни было эффектов. Я просто хочу, чтобы мое освещение работало лучше с большими полигонами.

Все уроки, которые я нашел, полезны только для освещения одного объекта, когда камера находится в положении 0,0,0 и направлена ​​ортогонально объекту. Вышеприведенное — единственное найденное, которое, по крайней мере, похоже на то, что я хочу сделать.

17
задан Sri Harsha Chilakapati 17 September 2013 в 03:09
поделиться