我正在尝试在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
答案 0 :(得分:1)
您需要另一个顶点着色器输入,它接收每个顶点的UV坐标。将它们转发到片段着色器而不直接修改它们(使用另一个smooth out
输出)。
在片段着色器中,您通常会执行以下操作:
vFragColor = texture(colorTable, textureCoordinate)
* texture(modelTexture, modelTextureCoordinate);
..达到预期的效果。由于1d纹理查找已经为您提供了典型的toon-ish场景的锐利光照,因此添加纹理只是将其颜色值与计算出的光强度相乘。如果您的纹理图像太过漫画风格,那么效果最佳。