我正在尝试在 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);
}
任何人都可以帮助我让这个着色器处理纹理吗?
谢谢
最佳答案
您需要另一个顶点着色器输入来接收每个顶点的 UV 坐标。将它们转发到片段着色器而不直接修改它们(使用另一个smooth out
输出)。
在片段着色器中,你通常会做这样的事情:
vFragColor = texture(colorTable, textureCoordinate)
* texture(modelTexture, modelTextureCoordinate);
..达到预期效果。由于 1d 纹理查找已经为您提供了典型的卡通场景的锐利照明,因此添加纹理只是将其颜色值乘以计算出的光强度。如果你的纹理图像有点漫画风格,它看起来最好。
关于c++ - 带有纹理的卡通着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5766965/