Toon Shader с текстурами - PullRequest
       0

Toon Shader с текстурами

2 голосов
/ 24 апреля 2011

Я пытаюсь реализовать toon shader с текстурой, используя C ++ на opengl 3+, но через неделю я получил только цвет toon shade без текстур.

файл вершин:

#version 330

// Incoming per vertex... position and normal
in vec4 vVertex;
in vec3 vNormal;

smooth out float textureCoordinate;

uniform vec3    vLightPosition;
uniform mat4    mvpMatrix;
uniform mat4    mvMatrix;
uniform mat3    normalMatrix;


void main(void) 
    { 
    // Get surface normal in eye coordinates
    vec3 vEyeNormal = normalMatrix * vNormal;

    // Get vertex position in eye coordinates
    vec4 vPosition4 = mvMatrix * vVertex;
    vec3 vPosition3 = vPosition4.xyz / vPosition4.w;

    // Get vector to light source
    vec3 vLightDir = normalize(vLightPosition - vPosition3);

    // Dot product gives us diffuse intensity
    textureCoordinate = max(0.0, dot(vEyeNormal, vLightDir));

    // Don't forget to transform the geometry!
    gl_Position = mvpMatrix * vVertex;
    }

файл фрагмента:

//
#version 330

uniform sampler1D colorTable;
out vec4 vFragColor;

smooth in float textureCoordinate;


void main(void)
   { 
   vFragColor = texture(colorTable, textureCoordinate);
   }

Может кто-нибудь дать мне руку, чтобы этот шейдер работал с текстурами?

ТНХ

1 Ответ

1 голос
/ 24 апреля 2011

Вам нужен еще один вход вершинного шейдера, который получает координаты UV для каждой вершины. Перенаправьте их в фрагментный шейдер, не изменяя их напрямую (используя другой вывод smooth out).

В фрагментном шейдере вы обычно делаете что-то вроде этого:

vFragColor = texture(colorTable, textureCoordinate) 
    * texture(modelTexture, modelTextureCoordinate);

.. для достижения желаемого эффекта. Так как поиск текстуры 1d уже дает вам вид резкого освещения, типичного для новых сцен, добавление текстуры просто умножает ее значение цвета на вычисленную интенсивность света. Лучше всего выглядит, если ваше текстурное изображение слишком комично.

...