2

OpenGL 3+ で C++ を使用してテクスチャ付きのトゥーン シェーダを実装しようとしていますが、1 週間後にはテクスチャのないカラー トゥーン シェードしか取得できませんでした。

頂点ファイル:

#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);
   }

このシェーダをテクスチャで動作させるために誰か手を貸してもらえますか?

どうも

4

1 に答える 1

1

各頂点の UV 座標を受け取る別の頂点シェーダー入力が必要です。smooth outそれらを (別の出力を使用して) 直接変更せずにフラグメント シェーダーに転送します。

フラグメント シェーダーでは、通常、次のようにします。

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

.. 目的の効果を達成するために。1D テクスチャ ルックアップは、トゥーンっぽいシーンに典型的なシャープなライティングを既に提供しているため、テクスチャを追加することは、そのカラー値に計算されたライト強度を乗算するだけです。テクスチャ イメージが少しコミック スタイルの場合に最適です。

于 2011-04-23T21:17:05.023 に答える