2012-03-22 2 views
1

Мой вопрос касается того, как texturecoordinate точно соответствует текстуре текстуры (не учитывая фильтрацию).Координата текстуры GLSL для абсолютного пикселя?

делает (0,0), например, ссылается на верхний левый угол верхнего левого пикселя или ссылается на центр верхнего левого пикселя?

при использовании фильтра с близким фильтром, какой пиксель выбирается по координате текстуры (0,5,0,5)?

Что касается (1.0,1.0), это относится к нижнему правому углу нижнего правого пикселя или, скорее, к верхнему левому углу нижнего правого пикселя? (я могу вспомнить, что несколько лет назад это отличалось между некоторыми картами ATI и NVIDIA, теперь оно стандартизировано?)

, если вы используете texelFetch() вместо textureLod(), каков правильный способ доступа к пикселю?

это

ivec2 size = textureSize(sampler,0); 
ivec2 iCoords = ivec2(int(uv.x*size.x),int(uv.y*size.y)); 
vec4 col = texelFetch(sampler,iCoords); 

или, может быть,

ivec2 iCoords = ivec2(int(uv.x*size.x+0.5f),int(uv.y*size.y+0.5f)); 

правильно?

или даже

ivec2 iCoords = ivec2(int(uv.x*(size.x+1)),int(uv.y*(size.y+1))); 

?

Возможно, кто-то может уточнить, как точно работает отображение?

+0

Это FAQ. Я несколько раз отвечал на него на StackOverflow.com http://stackoverflow.com/a/7272871/524368 http://stackoverflow.com/a/5879551/524368 – datenwolf

ответ

5

Если ваш вопрос просто сделан из любопытства: AFAIK нет стандартного ответа на этот вопрос, так как ваши координаты текстуры не обязательно должны заканчиваться на 1.0. Также графические карты будут обрабатывать значения по-другому (некоторые графические карты сегодня поддерживают 64-битные FP-Ops, например). Я думаю, что вы всегда должны пытаться кодировать безопасную сторону и, возможно, использовать 0.999 вместо 1.0, если это применимо.

В противном случае, если вы ищете способ считывания пикселей из визуализированной текстуры, вы можете определить свой видовой экран, как описано в разделе the website of dominik göddeke on gpgpu. Если вы установите для видового экрана размер текстуры, вы можете просто захватить пиксели в исходных координатах. Я действительно рекомендую сайт, это очень помогло мне.

UPDATE: Координаты текстуры интерполируются между первым и последним пикселями в текстуре при использовании GL_REPEAT. Таким образом, центр первого пикселя в текстуре 4 текселя составляет 0,125, поскольку каждый пиксель имеет ширину 0,25 или 1/4.

Это объясняет это более наглядно: Texture interpolation on 4 texels

Как вы можете видеть, тексели в [0,0] является линейным сочетанием [0.125,0] и [0.875,0] и равно [1 , 1] в этом примере.

Все, что очень хорошо объяснено на DelphiGL Wiki (english translation)

Я прошу прощения за путаницу в первый.

+0

поэтому, если он ссылается на центр пикселя, затем, например, (-0,0001, -0.0001) все равно будет ссылаться на topLeftPixel? (при условии, что текстура завершена, а текстура мала) – user1282931

+0

mmmh - но если это верно, и u создаст квадрат с uv координатами (0,0) - (1,1) на угловых вершинах и текстурой, тогда u будет видеть только половину текстурных пограничных текселей .... – user1282931

+0

Это зависит от параметра 'GL_TEXTURE_WRAP_S/T'. Если вы включили 'GL_REPEAT' и' GL_LINEAR', тогда (-0.0001, -0.0001) будет минимально интерполироваться с помощью (texsize_x, texsize_y). Если вы включили 'GL_NEAREST', он все равно вернет цвет текстуры в (0,0) – devsnd

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