2013-02-10 6 views
1

Я хочу исчезнуть экран определенного цвета с использованием GLSL До сих пор это мой GLSL код и он работает очень хорошо:Fade экрана для определенного цвета с использованием GLSL

uniform sampler2D textureSampler; 
uniform vec2 texcoordOffset; 
uniform vec3 sp; 
uniform vec3 goal; 
varying vec4 vertColor; 
varying vec4 vertTexcoord; 
void main(void) { 
    vec3 col=texture2D(textureSampler, vertTexcoord.st).rgb; 
    gl_FragColor = vec4(col+((goal-col)/sp), 1.0); 
    //gl_FragColor = vec4(col+((goal-col)*sp), 1.0); //as suggested below also this doesn't solve the problem 
} 

Единственная проблема у меня есть то, что с более высокими значениями sp, цвета не полностью исчезли до нового цвета. Я думаю, проблема связана с точностью, которая работает с шейдером. У любого есть идея, как повысить точность?

EDIT: Возможно ли, что этот эффект зависит от водителя? Я использую ATI с последними драйверами, возможно, кто-то может попробовать код на карте NVIDIA?

+0

Обычно выцветание экрана выполняется путем рендеринга квадроцикла поверх всего с применением смешивания. –

+0

@NicolBolas Похоже, что это пост-эффект. –

+0

@NicolBolas Я также пробовал использовать квадроцикл поверх всего, но проблема все еще появляется. – Ranking

ответ

2

Давайте разбить его:

float A, B: 
float Mix; 

float C = A + (B-A)/Mix; 

Теперь это довольно легко увидеть, что Mix должен быть бесконечным, чтобы создать чистый А, так это не вина GLSL вообще. Обычно используемое уравнение выглядит следующим образом:

float C = A + (B-A) * Mix; 
// Let's feed some data: 
// Mix = 0 -> C = A; 
// Mix = 1 -> C = A + (B - A) = A + B - A = B; 
// Mix = 0.5 -> C = A + 0.5*(B - A) = A + 0.5*B - 0.5*A = 0.5*A + 0.5*B 

Правильно, правда?

Изменить код:

gl_FragColor = vec4(col+((goal-col) * sp), 1.0); 

И использовать диапазон от <0,1> в зр вместо. Кроме того, не следует ли на самом деле плавать sp? Если все его компоненты равны (IOW sp.x == sp.y == sp.z), вы можете просто изменить его тип, и он будет работать, как referenced here.

+0

Основной код расчета, который я использовал, был: [link] (http://www.wiki.processing.org/w/Fading_the_screen_to_black/any_color) Они сделали это с использованием бит-сдвига, который равен делению на pow (2, x) правильно? Я попробовал ваш ответ, но Ghosting (я думаю, что вызванный эффект получился так) все еще появляется для значений около 0. И да, sp используется как vec3, потому что я хочу затухать экран с разной скоростью для цветов. – Ranking

+0

@Ranking, комментарий к функции, на которую вы ссылались: ** // ПРИМЕЧАНИЕ: эта функция в настоящее время НЕ РАБОТАЕТ ** –

+0

Работает в более ранней версии обработки. Позже я изменил его, чтобы иметь возможность изменять скорости затухания: 'void fadescr (int r, int g, int b, int spr, int spg, int spb) { int red, green, blue; loadPixels(); для (int i = 0; i <пикселей.длина; i ++) { red = (pixels [i] >> 16) & 0x000000ff; green = (pixels [i] >> 8) & 0x000000ff; синий = пиксели [i] & 0x000000ff; пикселей [i] = (((красный + ((r-красный) >> spr)) << 16) | ((зеленый + ((g-green) >> spg)) << 8) | (синий + ((b -Синий) >> спб))); } updatePixels(); } ' И теперь я попробую реализовать его в glsl. С этой функцией не было Призраков. – Ranking

 Смежные вопросы

  • Нет связанных вопросов^_^