2015-07-24 2 views
0

Я столкнулся с следующей (я думаю) точностью.OpenGL ES God Ray Precision error

enter image description here

enter image description here

Мой источник вдохновения был: http://fabiensanglard.net/lightScattering/

На ПК все работает отлично, но на андроид он показывает эти странные квадраты.

У меня была такая же проблема с процедурно маскированным спрайтом. Когда радиус круга стал слишком большим, у меня была такая же ошибка, поэтому я сменил маску с равномерным радиусом шейдера на однородную текстуру, поэтому я думаю, что существует проблема точности.

У этого парня была такая же проблема, но, к сожалению, я не вижу ответа.

http://community.arm.com/thread/4024

код адаптирован к OpenGL ES заключается в следующем:

#version 100 

precision mediump float; 

uniform sampler2D tex_diff; 
uniform vec2 light_on_screen; 

varying vec2 texture_coord; 

const int NUM_SAMPLES = 128; 

void main() 
{ 
    const float exposure = 0.0225; 
    const float decay = 0.95; 
    const float density = 0.95; 
    const float weight = 3.75; 

    // Inner used valuesa 
    vec2 deltaTextCoord = vec2(texture_coord.st - light_on_screen.xy); 
    vec2 textCoo = texture_coord.st; 
    deltaTextCoord *= 1.0/float(NUM_SAMPLES) * density; 
    float illuminationDecay = 1.0; 

    vec4 c = vec4(0, 0, 0, 0); 

    for(int i=0; i < NUM_SAMPLES ; i++) 
    { 
     textCoo -= deltaTextCoord; 

     textCoo.s = clamp(textCoo.s, 0.0, 1.0); 
     textCoo.t = clamp(textCoo.t, 0.0, 1.0); 

     vec4 sample = texture2D(tex_diff, textCoo); 

     sample *= illuminationDecay * weight; 

     c += sample; 

     illuminationDecay *= decay; 
    } 

    c *= exposure; 

    c.r = clamp(c.r, 0.0, 1.0); 
    c.g = clamp(c.g, 0.0, 1.0); 
    c.b = clamp(c.b, 0.0, 1.0); 
    c.a = clamp(c.a, 0.0, 1.0); 

    gl_FragColor = c; 
} 

Показаны весь двигатель бесполезно, так как это огромно. Весь вход шейдера верен, координаты верны, единственная проблема заключается в вычислении внутреннего шейдера.

Кто-нибудь сталкивался с этим или имел какие-либо идеи для любых обходных решений?

Отсканировал всю сеть для решения этой проблемы, и я не мог ее найти. Любой может указать мне в правильном направлении? Или, может быть, кто-то столкнулся с этим типом ошибок в другом контексте или в другом шейдере? Возможно, я тоже могу применить обходное решение.

+0

Я бы добавить слово предупреждения, что этот метод безумно дорог для мобильных устройств исключения случаев, когда вы выполняете рендеринг с очень низким разрешением (большинство высококачественных материалов будут использовать в среднем менее 10 текстурных изображений на пиксель на экране, для этого вы используете 128 текстурных поисков на пиксель). – solidpixel

ответ

0

Обновлено с небольшим исправлением:

enter image description here

enter image description here

Да, проблема была:

'textCoo - = deltaTextCoord';

Из-за точности fp накопленная ошибка увеличивается до 2,7%. Вычисляя его, каждый цикл вместо вычитания дельта фиксирует большую часть проблемы.

Что касается оптимизации, я использую некоторые методы, получив разумные 40 кадров в секунду.

Посмотреть этот пост, я задал тот же вопрос здесь: http://community.arm.com/message/29658?et=watches.email.thread#29658

Для оптимизации используемых см этого поста: http://www.gamedev.net/topic/670346-opengl-es-god-ray-precision-error/

1

Одним из распространенных отличий является использование mediump на мобильном телефоне (обычно это fp16) и рабочий стол (который часто не реализует fp16 и просто продвигается до fp32).

Если вы используете highp, он выглядит лучше?

+0

Обратите внимание: если вы пытаетесь запустить этот фрагментарный шейдер на графическом процессоре Mali 400, то настройка точности на highp не будет работать, потому что этот конкретный GPU не может обрабатывать highp в фрагментах (он может в вершине, а не в фрагментах ...) Нет такого решения, к сожалению, единственное, что вы можете попытаться сделать, это попытаться использовать «большие ценности» до самого последнего момента, который может сохранить точность немного дольше, как описано в ссылке на руку. На графических процессорах Adreno/Tegra/PowerVR он должен работать, если вы измените точность на highp. –

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