c++ - 带有纹理的卡通着色器

标签 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);
   }

任何人都可以帮助我让这个着色器处理纹理吗?

谢谢

最佳答案

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

在片段着色器中,你通常会做这样的事情:

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

..达到预期效果。由于 1d 纹理查找已经为您提供了典型的卡通场景的锐利照明,因此添加纹理只是将其颜色值乘以计算出的光强度。如果你的纹理图像有点漫画风格,它看起来最好。

关于c++ - 带有纹理的卡通着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5766965/

相关文章:

c++ - 在 C++ 中正确处理来自 argv 的字符串中的转义序列

c++ - 将 vim 设置为 C++ IDE

opengl - 我们如何获得 glDrawElements() 的索引?

java - 纹理渲染为黑色四边形

c - Opengl 翻译/旋转来自同一缓冲区的单个对象

c++ - boost::thread - 简单示例不起作用 (C++)

c++ - 从 QThread 使用 QCamera/QCameraInfo

c++ - 尝试实现渲染到纹理

opengl - 获取当前片段颜色

c++ - 类没有命名类型错误