2014-12-28 1 views
0

조각 쉐이더에서 보간에 문제가 있습니다. 전체 화면 쿼드를 그리기 만하면됩니다. 뷰포트는 (0, 0, 128, 128)로 설정됩니다.조각 쉐이더의 보간은 0 + 반 화소에서 시작합니다

각 정점에는 텍스처 좌표가 있습니다.

var textureCoordinates = [ 
    0.0, 1.0, 
    1.0, 1.0, 
    0.0, 0.0, 
    1.0, 0.0 
]; 

난 감촉 잘 작동 변하는 변수를 통해 단편 쉐이더 정점 셰이더 좌표로부터 패스.

보간은 0 + halfpixel에서 시작하여 1-halfpixel로 끝나는 것이 문제입니다. 절반 픽셀은 (1/128) * 0.5입니다.

보간을 0에서 시작하여 1로 끝내고 싶습니다. vTextureCoord가 프래그먼트 셰이더에있는 노이즈 함수의 입력으로 사용되기 때문입니다.

MAG 필터와 MIN 필터는 모두 NEAREST로 설정됩니다.

WRAP_S 및 WRAP_T는 CLAMP_TO_EDGE로 설정됩니다.

텍스처 좌표 속성은 필수는 아니며 0에서 1까지의 숫자를 보간하는 내 방식 일뿐입니다. 조각 쉐이더에서 0에서 1까지의 숫자를 보간하는 간단한 방법이 있다면 속성을 알고 싶다면 어떻게 해야할지!

텍스처 좌표를 반 화소만큼 오프셋하려고했지만 예상 한대로 작동하지 않습니다.

나는 또한 조각 쉐이더에 절반 픽셀을 뺄려고했는데, 다음 보간 1.

newTextureCoord = vTextureCoord - (1.0/128.0) * 0.5; 

에서 끝나지 않는다 모든 팁은, 의견이나 피드백은 매우 감사합니다!

+0

정점 좌표도 전달하고 있습니까? 버텍스 좌표를 버텍스 쉐이더에 3 개의 컴포넌트 배열 (버텍스 쉐이더에서는 vec4로 선언)로, 텍스쳐 좌표는 2 개의 컴포넌트 배열 (버텍스 쉐이더에서는 vec2로 선언)으로 전달해야합니다. Wrap_S 및 Wrap_T 들어,이 질감의 GL_CLAMP 사용할 수 있습니다. – jwlaughton

+0

예 저는 정점 좌표를 전달하고 있습니다. 모든 것이 정확하게 그려지고 있습니다. 내가 필요한만큼 동작하지 않는 보간입니다. var noiseVertices = [ -1.0, 1.0, 0.0, 1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0 ]; – raRaRa

+0

그런 다음 WRAP_S 및 WRAP_T에 대한 GL_CLAMP가 대답 일 수 있습니다. – jwlaughton

답변

3

멀티 샘플링 기술을 사용하지 않으면 조각은 항상 픽셀 센터에서 샘플링됩니다. 보이는 동작은 의도 한 동작입니다.

언급 한 텍스처 샘플 매개 변수는 보간에 전혀 영향을 미치지 않습니다. 이것들은, GLSL 함수 군 texture() 패밀리를 사용해 텍스처로부터 샘플링했을 경우에만 효과가 있습니다.

texcoords를 0.5 픽셀 씩 이동하는 것만으로는 충분하지 않으며 축척이 필요하다는 의견을 말씀하시는 것이 좋습니다. 당신이 원하는 것은 f (0.5/128) = 0과 f (127.5/128) = 1의 매핑입니다. 이것은 당연히 간단한 선형 변환 f (x) = (128/127) * x - 1/(2 * 127)입니다. 따라서 적어도 런타임 오버 헤드가 없도록 꼭지점 코디에 적용 할 수 있습니다. 뷰포트 크기가 일정한 경우

1

텍스처 좌표가 적용되는 방식은 0은 첫 번째 텍셀의 왼쪽 가장자리에 해당하고 1은 마지막 텍셀의 오른쪽 가장자리에 해당합니다. 크기가 128 인 경우 첫 번째 텍셀은 텍스처 좌표 범위가 0에서 1/128까지이고 중심이 0.5/128입니다. 마지막 텍셀 범위는 127/128에서 1까지이며, 중심은 127.5/128입니다.

첫 번째/마지막 텍셀의 중심을 가장자리에 배치하려면 왼쪽 가장자리에 텍셀 절반의 너비를 더하고 오른쪽 가장자리에 같은 크기를 뺀 다음 텍스처 좌표를 조정해야합니다. 오른쪽 가장자리 :

var textureCoordinates = [ 
    0.5/128.0, 127.5/128.0, 
    127.5/128.0, 127.5/128.0, 
    0.5/128.0, 0.5/128.0, 
    127.5/128.0, 0.5/128.0 
];