Cel-Shading 对 BMP 模型纹理的影响?
Posted
技术标签:
【中文标题】Cel-Shading 对 BMP 模型纹理的影响?【英文标题】:Cel-Shading effect on BMP model textures? 【发布时间】:2011-11-21 17:42:46 【问题描述】:我偶然发现了Nehe's Cel-Shading Tutorial,我想知道是否可以将这种技术应用于纹理几何体......
我知道在该代码中,效果是通过将一个单色纹理应用于模型来获得的,我认为教程中的相关代码是加载着色器效果的以下代码:
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 纹理的模型上运行它,并获得该纹理的 cel-shaded 外观?
【问题讨论】:
【参考方案1】:您实际上并不需要 1D 纹理来进行 cel 着色。您可以通过以下方式使其程序化:
// 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 控制步进高度。
【讨论】:
谢谢你...但我有点初学者...这些行在哪里适合该代码? 在片段着色器中。你在使用着色器吗?如果没有,那么是时候这样做了! 有没有办法通过 OpenGL 应用它,就像在示例代码的其余部分中一样? 您可以使用多重纹理来实现,将 1D 纹理设置为调制模式,但我并不是很喜欢旧的 OpenGL API 来告诉您确切的步骤。着色器已经存在多年,使用它们制作图形效果要容易得多。【参考方案2】:在他关于gamedev.netMENTAL 的教程中,给出了如何将Cel-shaded 外观应用于纹理模型的方法。
但是,这种方法并不能提供预期的结果——照明看起来非常“平滑”——这是因为 OpenGL 在切换到 GL_SMOOTH 模式时会沿多边形插入颜色值。我使用的是旧式 OpenGL 1.1 即时模式,对着色器一无所知。
我的方法是使用 ARB 扩展中的多重纹理或使用 Alpha 通道和混合。从概念上讲,您只需设置 2 个纹理 - 一个 2D 用于对象的纹理,第二个是 1D - 用于锐利的照明。
您通过点积计算第二个纹理坐标,并且您可以通过扩展使用多重纹理(虽然自己没有尝试过),或者在 2 条路径中渲染您的对象,应用 alpha 测试和混合(或只是混合) .稍后我将尝试发布我的实验的源代码来举例说明这种方法。
【讨论】:
以上是关于Cel-Shading 对 BMP 模型纹理的影响?的主要内容,如果未能解决你的问题,请参考以下文章