Влияние Cel-Shading на текстуры модели BMP? - PullRequest
1 голос
/ 21 ноября 2011

Я наткнулся на Учебное пособие Нехе по Cel-Shading , и мне было интересно, возможно ли применить этот метод к текстурированной геометрии ...

Я понимаю, что в этом коде эффект получается путем применения к модели одной одноцветной текстуры. Соответствующий код из учебника, как мне кажется, следующий для загрузки эффекта шейдера:

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, и получить затененный в клетку вид этой текстуры?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Вам на самом деле не нужна 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) дает прекрасную функцию шагания, М управляет высотой шага.

0 голосов
/ 03 февраля 2013

В своем уроке по gamedev.net MENTAL предлагает подход к применению Cel-затененного вида к текстурированной модели.

Однако этот подход не дает желаемых результатов - освещение выглядит очень «плавным», потому что OpenGL интерполирует значения цвета вдоль многоугольника при переключении в режим GL_SMOOTH.Я использую немедленный режим OpenGL 1.1 старого стиля и не имею никакого представления о шейдерах.

Мой подход заключается в том, чтобы либо использовать мультитекстурирование из расширений ARB, либо играть с альфа-каналом и смешиванием.Концептуально вы просто устанавливаете 2 текстуры - одну 2D для текстуры объекта, а другую 1D - для четкого освещения.

Вы вычисляете координату текстуры второго по точечному произведению, и вы либо используете мультитекстурирование с помощью расширений (хотя я сам не пробовал), либо визуализируете свой объект в 2-х путях, применяя альфа-тест и смешивание (или простосмешивание).Вскоре после этого я постараюсь опубликовать исходный код для своих экспериментов, чтобы объяснить этот подход.

...