Cel-Shading对BMP模型纹理的影响?

时间:2011-11-21 17:42:46

标签: c++ opengl shader

我偶然发现了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外观?

2 个答案:

答案 0 :(得分: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控制步高。

答案 1 :(得分:0)

在他关于gamedev.net的教程中,MENTAL提供了一种如何将Cel-shaded外观应用于纹理模型的方法。

然而,这种方法并没有产生预期的效果 - 灯光看起来非常“平滑” - 这是因为当切换到GL_SMOOTH模式时,OpenGL会沿着多边形插值颜色值。我使用的是旧式的OpenGL 1.1立即模式,并且没有关于着色器的任何线索。

我的方法是使用ARB扩展中的多重纹理或使用alpha通道和混合。从概念上讲,您只需设置2个纹理 - 一个2D用于对象的纹理,第二个用于1D - 用于锐利照明。

你用点积计算第二个纹理坐标,你要么通过扩展使用多纹理(虽然我自己没试过),或者在2个路径中渲染你的对象,应用alpha测试和混合(或者只是混合) 。我会在不久之后尝试为我的实验发布一个源代码来解释这种方法。