2012-01-17 2 views
0

У меня есть шейдер обнаружения границ, который отлично работает как обеими обезьянами рендеринга, так и моей HTC Desire HD. Однако он не работает на моем LG 3D P920. Вот шейдер:Посторонние эффекты OpenGLSL - не уверены в причине

Короче говоря, я беру центральный пиксель и вычитаю 8 значений вокруг него. Текстура составляет 512x512.

precision highp float; 

varying vec2 vTextureCoord; 

uniform sampler2D sTexture; 

vec4 edges(void) 
{ 
    const float offset = 1.0/512.0; 
    vec4 c = texture2D(sTexture, vTextureCoord); 
    vec4 edge = texture2D(sTexture, vTextureCoord + vec2(-offset, -offset)) + 
    texture2D(sTexture, vTextureCoord + vec2(-offset, 0.0)) + 
    texture2D(sTexture, vTextureCoord + vec2(-offset, offset)) + 
    texture2D(sTexture, vTextureCoord + vec2(0.0, offset)) + 
    texture2D(sTexture, vTextureCoord + vec2(offset, offset)) + 
    texture2D(sTexture, vTextureCoord + vec2(offset, 0.0)) + 
    texture2D(sTexture, vTextureCoord + vec2(offset, -offset)) + 
    texture2D(sTexture, vTextureCoord + vec2(0.0, -offset)); 

    return 8.0 * (c + -0.125 * edge); 
} 

void main() { 
    gl_FragColor = edges(); 
} 

Теперь на ПК и желании HD это изображение в основном черного цвета с выделенными выделенными краями. Однако на устройстве LG оно отображается как изображение с повышенной экспозицией, но с довольно небольшим количеством шума.

Это ощущение точности, и, как вы можете видеть, я пытался повысить точность, но я не знаю, что еще попробовать или если я сделал это правильно.

Это не изолировано от этого шейдера, у меня есть шейдер освещения, который, кажется, имеет шум на этом устройстве, но не на других.

Я также попытался закрепить конечное значение.

ответ

1

Я верю, что это вопрос о прекращении. Документация из PowerVR гласит, что texture2D возвращает данные lowp, если пробоотборник не указан с более высокой точностью. Но делать это только на флоат-текстурах.

Так вместо того, повысит точность на сэмплер, это имеет желаемый эффект:

vec4 edge = texture2D(sTexture, vTextureCoord + vec2(-offset, -offset)); 
edge += texture2D(sTexture, vTextureCoord + vec2(-offset, 0.0)); 
edge += texture2D(sTexture, vTextureCoord + vec2(-offset, offset)); 
edge += texture2D(sTexture, vTextureCoord + vec2(0.0, offset)) ; 
edge += texture2D(sTexture, vTextureCoord + vec2(offset, offset)) ; 
edge += texture2D(sTexture, vTextureCoord + vec2(offset, 0.0)); 
edge += texture2D(sTexture, vTextureCoord + vec2(offset, -offset)); 
edge += texture2D(sTexture, vTextureCoord + vec2(0.0, -offset)); 

и lowp vec4 edge =... обнажает проблему, которую я видел раньше.

P.S. Я знаю, что должен оптимизировать, только беря требуемые каналы, в этом случае .rgb

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

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