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 模型纹理的影响?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时使用 .bmp 文件并在 Unity 中创建纹理?

在OpenGL中将纹理bmp文件作为纹理平铺到矩形上?

BMP 纹理不显示

OpenGL中不用AUX库来加载BMP图片作为纹理

OpenGL 纹理坐标没有影响

我的 bmp imporer 怎么了?