2014-07-12 1 views
0

0에서 1까지의 512 값을 보유하는 1 차원 텍스처를 사용하여 간단한 텍스처 쿼드 (2 삼각형)를 그립니다. NVIDIA GeForce GT 750M에서 RGBA_32F를 사용하고 있습니다. GL_LINEAR 보간 및 GL_CLAMP_TO_EDGE.OpenGL 텍스처 정밀도/texcoord 대 속성

I는 다음 셰이더를 사용하여 쿼드 그린다

varying vec2 v_texcoord; 
uniform sampler1D u_texture; 

void main() 
{ 
    float x = v_texcoord.x; 
    float v = 512.0 * abs(texture1D(u_texture,x).r - x); 
    gl_FragColor = vec4(v,v,v,1); 
} 

을 기본적으로, 텍스처 값과 파편 좌표 사이의 차이를 표시하고있다. (

result

내가 문제를 좁힐 만이 값을 한 차원 텍스처를 생성하려고 시도 0 : 여기 검은 쿼드 (차이가 없음)을 얻을 수 있었으면하지만되었다 내가 대신 무엇을 얻을 1) 및 사용하여 표시 : 다음

varying vec2 v_texcoord; 
uniform sampler1D u_texture; 

void main() 
{ 
    float x = v_texcoord.x; 
    float v = texture1D(u_texture,x).r; 
    gl_FragColor = vec4(v,v,v,1); 
} 

를 내가 얻을 :

Linear interpolation

OBVIO usly 이것은 0에서 1까지의 선형 보간이 아닙니다. 결과는 검정, 보간 및 흰색의 3 개 영역으로 나뉘는 것으로 보입니다. 다른 래핑 값을 시도했지만 성공하지 못했습니다 (그러나 다른 결과). 내가 여기서 뭘 잘못하고 있는거야?

+0

버텍스 쉐이더에서 색상을 결정한 다음이를 프랙 처 쉐이더로 전달하면 차이가 있습니까? –

+0

예, 텍스처는 실제로 모든 조각에서 함수를 보간하는 데 사용됩니다. 나는 여기에 단순화 된 버전을 게시했습니다. –

답변

0

보다 조금 검색 후에는 질감 텍스처의 크기에 따라 작은 조정이 가능 필요 보인다

varying vec2 v_texcoord; 
uniform sampler1D u_texture; 
uniform float u_texture_shape; 

void main() 
{ 
    float epsilon = 1.0/u_texture_shape; 
    float x = epsilon/2.0 +(1.0-epsilon)*v_texcoord.x; 
    float v = 512.0*abs(texture1D(u_texture,x).r -v_texcoord.x); 
    gl_FragColor = vec4(v,v,v,1); 
} 

나는이 모드를 포장과 관련된하지만 포장이 강제로 적용하는 방법에 대한 정보를 찾을 수 없습니다 추측 GPU 레벨.

+1

이것은 래핑과는 아무런 관련이 없습니다.하지만 texcoord 0은 _center_가 아닌 가장 왼쪽의 텍셀의 왼쪽 _border_에 있으며 1은 오른쪽 텍셀의 오른쪽 테두리입니다. 이 가장 바깥 쪽의 텍셀의 중심. – derhass

+1

사이드 노드로서 : 2 요소 와이드 [0,1] 1D 텍스처와 1024 픽셀의 출력 해상도를 사용할 때 수정 된 코드의 결과에 여전히 놀라실 수 있습니다. 텍스처 샘플링과 관련하여 정밀도 문제가 있습니다. 많은 현대 GPU는 _texcoords_에 대해 고정 소수점 표현을 사용하기 때문에 두 개의 텍셀 (일반적으로 256) 사이에서 샘플링 할 수있는 제한된 위치 집합 만 있습니다. NVidia는이를 CUDA 문서에 문서화하며 OpenGL에서도 유효합니다. – derhass

+0

당신은 완전히 옳습니다. 이 매우 유용한 설명에 감사드립니다. –