香椿着色器与纹理

时间:2011-04-23 21:09:27

标签: c++ opengl-3

我正在尝试在opengl 3+上使用C ++实现一个带纹理的香椿着色器,但是一周之后我只得到一个没有纹理的颜色香椿阴影。

顶点文件:

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

任何人都可以帮我把这个着色器用于纹理吗?

THX

1 个答案:

答案 0 :(得分:1)

您需要另一个顶点着色器输入,它接收每个顶点的UV坐标。将它们转发到片段着色器而不直接修改它们(使用另一个smooth out输出)。

在片段着色器中,您通常会执行以下操作:

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

..达到预期的效果。由于1d纹理查找已经为您提供了典型的toon-ish场景的锐利光照,因此添加纹理只是将其颜色值与计算出的光强度相乘。如果您的纹理图像太过漫画风格,那么效果最佳。