Странные эффекты OpenGLSL - не уверен в причине - PullRequest
0 голосов
/ 18 января 2012

У меня есть шейдер обнаружения краев, который отлично работает как на обезьяне рендера, так и на моем HTC Desire HD.Тем не менее, он не работает на моем LG 3D P920.Вот шейдер:

Короче, я беру центральный пиксель и вычитая 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();
}

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

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

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

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

1 Ответ

1 голос
/ 18 января 2012

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

Таким образом, вместо повышения точности на сэмплере, это дает желаемый эффект:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...