在BMP模型纹理上的细胞阴影效果
Cel-Shading effect on BMP model textures?
我偶然发现了Nehe的细胞阴影教程,我想知道是否有可能将这种技术应用于纹理几何....
我理解,在代码的效果是通过应用一个单色纹理模型,我认为从教程的相关代码是以下加载着色器效果:
In = fopen ("Data\shader.txt", "r"); // Open The Shader File
if (In) // Check To See If The File Opened
{
for (i = 0; i < 32; i++) // Loop Though The 32 Greyscale Values
{
if (feof (In)) // Check For The End Of The File
break;
fgets (Line, 255, In); // Get The Current Line
// Copy Over The Value
shaderData[i][0] = shaderData[i][1] = shaderData[i][2] = atof (Line);
}
fclose (In); // Close The File
}
else
return FALSE;
glGenTextures (1, &shaderTexture[0]); // Get A Free Texture ID
glBindTexture (GL_TEXTURE_1D, shaderTexture[0]); // Bind This Texture. From Now On It Will Be 1D
// For Crying Out Loud Don't Let OpenGL Use Bi/Trilinear Filtering!
glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// Upload
glTexImage1D (GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGB , GL_FLOAT, shaderData);
和下面的代码来启用绘制
的效果// Cel-Shading Code
glEnable (GL_TEXTURE_1D); // Enable 1D Texturing
glBindTexture (GL_TEXTURE_1D, shaderTexture[0]); // Bind Our Texture
glColor3f (1.0f, 1.0f, 1.0f);
....
是否有一种方法可以在BMP GL_TEXTURE_2纹理的模型上运行,并获得该纹理的细胞阴影外观?
您实际上不需要1D纹理来进行细胞着色。你可以通过:
// GLSL fragment shader
vec3 colour = /* a value in range 0..1, possibly from a texture */
colour -= mod(colour, 0.2) /* limit the colour range for cel-shading */
这是有效的,因为x - mod(x, M)
产生了一个很好的步进函数,M控制步进高度。
MENTAL在他的gamedev.net教程中给出了如何将cel阴影外观应用于纹理模型的方法。
然而,这种方法并没有给出期望的结果-照明看起来非常"平滑"-这是因为OpenGL在切换到GL_SMOOTH模式时沿着多边形插值颜色值。我使用的是老式的OpenGL 1.1即时模式,对着色器没有任何线索。
我的方法是使用来自ARB扩展的多纹理,或者使用alpha通道和混合。从概念上讲,你只需要设置2个纹理-一个是2D的物体纹理,另一个是1D的-用于锐利的照明。
你通过点积计算第二个纹理坐标,你要么通过扩展使用多重纹理(虽然我自己没有尝试过),要么在2条路径上渲染你的对象,应用alpha-test和混合(或只是混合)。稍后,我将尝试为我的实验发布一个源代码,以说明这种方法。
相关文章:
- 在细胞中产生噪声 - CPP 和 GLSL
- C++声明模板参数阴影模板参数错误
- DirectX 11 - 点光源阴影
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 模板中的Typedef导致阴影模板parm错误
- C++具有内置缓存 - 阴影模板参数的对象工厂
- 使用 GCC 5 进行模板参数阴影
- OpenGL - 阴影贴图/深度贴图给出奇怪的结果
- 警告派生的类成员阴影级班级成员
- 多个快速读取器 单个慢速写入器:使用具有原子索引的阴影数据安全吗?
- 如何避免本地兰伯达阴影超负荷分辨率
- MFC 用于计算控件的高光、阴影等的算法或函数是什么?
- 活着的邻居细胞未正确计数
- 参数“队列内容”阴影模板参数模板类队列类型
- MPI 中的鬼细胞交换模式
- OpenGL:阴影/插值行不通
- 将std :: feek_ptr与std :: shared_ptr一起阴影
- 射线追踪:来自多个灯的阴影
- 在BMP模型纹理上的细胞阴影效果
- 细胞阴影轮廓:边缘网格书写器不定义所有所需的边缘