2011-04-23 7 views
6

현대 OpenGL에서 프로그래밍을 시도하기로 결정한 후에 고정 기능 파이프 라인을 남겨 두었고 이전과 동일한 기능을 얻는 것에 대해 확신하지 못했습니다.픽셀 완벽한 텍스처 매핑과 최신 OpenGL

텍스처 크기와 일치하는 완벽한 크기의 픽셀로 텍스처를 맵핑하려고합니다. 예를 들어, 128x128 텍스처는 크기가 128x128 인 쿼드로 매핑됩니다.

이것은 내 버텍스 쉐이더입니다.

 

    #version 110 
    uniform float fade_factor;  
    uniform sampler2D textures[1]; 
    varying vec2 texcoord; 

    void main() 
    { 
     gl_FragColor = texture2D(textures[0], texcoord); 
    } 
 

내 정점 데이터는 텍스처의 폭과 높이가 어디 w 및 h와 같은 것이다 :

 

    #version 110 
    uniform float xpos; 
    uniform float ypos; 
    uniform float tw; // texture width in pixels 
    uniform float th; // texture height in pixels 
    attribute vec4 position; 
    varying vec2 texcoord;   
void main() 
    { 
    mat4 projectionMatrix = mat4(2.0/600.0, 0.0, 0.0, -1.0, 
            0.0, 2.0/800.0, 0.0, -1.0, 
            0.0, 0.0, -1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0); 

    gl_Position = position * projectionMatrix; 
    texcoord = (gl_Position.xy); 
    } 
 

이 내 프래그먼트 쉐이더이다.

 

    [ 
    0, 0, 
    w, 0, 
    w, h, 
    0, h 
    ] 
 

나는 128 * 128 텍스처를로드하고이 쉐이더와 나는 이미지를 4 회 반복 참조 : http://i.stack.imgur.com/UY7Ts.jpg

올바른 길에 사람의 조언을 제공 번역 할 수 있도록 할 수와 규모가 TW의 일을 주어, X 좌표를 , xpos 유니폼?

+0

안녕하세요, 왼손잡이! StackOverflow에 오신 것을 환영합니다. 기억해야 할 몇 가지 사항은 네 개의 공백 (또는'{}'아이콘)으로 코드를 들여 쓰기하여 적절하게 형식을 지정하십시오. 또한 OpenGL 태그에 게시 할 때 OpenGL 버전을 지정할 때 도움이됩니다. 특히 OpenGL 2.0과 같이 코드 샘플이 실제로 유용하기는하지만 실제로는 "현대적"인 것은 아닙니다. :) – Kos

+0

답장을 보내 주셔서 감사합니다. 이것은 고정 함수 파이프 라인을 사용하지 않기 때문에 현대 OpenGL (> = 3?)입니다. 꼭지점 데이터가 배열로 제공되고 텍스처 샘플링이 쉐이더로 수행됩니다. 즉, 나는 아직도 비교적 새로운이에요 그래서 내가 틀렸다면 수정하십시오 :) – Lefty

+0

related http://stackoverflow.com/questions/7922526/opengl-deterministic-rendering-between-gpu-vendor –

답변

6

이에 문제가 :

mat4 projectionMatrix = mat4(2.0/600.0, 0.0, 0.0, -1.0, 
            0.0, 2.0/800.0, 0.0, -1.0, 
            0.0, 0.0, -1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0); 

gl_Position = position * projectionMatrix; 

변환 matices, 즉를 마우스 오른쪽 버튼으로 연관되어 당신이 반대 순서를 곱해야한다. 또한 일반적으로 셰이더에 투영 행렬을 지정하지 않으면 유니폼으로 전달합니다. OpenGL은 투영 및 모델 뷰를 위해 유니폼을 사용할 준비가되었습니다. OpenGL-3 코어에서는 통일성을 유지하기 위해 통일 된 이름을 재사용 할 수 있습니다.

// predefined by OpenGL version < 3 core: 
#if __VERSION__ < 400 
uniform mat4 gl_ProjectionMatrix; 
uniform mat4 gl_ModelviewMatrx; 
uniform mat4 gl_ModelviewProjectionMatrix; // premultiplied gl_ProjectionMatrix * gl_ModelviewMatrix 
uniform mat4 gl_ModelviewInverseTranspose; // needed for transformin normals 

attribute vec4 gl_Vertex; 

varying vec4 gl_TexCoord[]; 
#endif 

void main() 
{ 
    gl_Position = gl_ModelviewProjectionMatrix * gl_Vertex; 
} 

다음으로 텍스처 화소 (텍셀)를 처리하지 않는 텍스쳐 좌표를 알고 있어야하지만, 질감이 주어진 샘플링 포인트와 보간 함수로서 이해되어야한다; 텍스처 좌표 0 또는 1은 텍셀의 중심을 치지 않지만 랩 어라운드 사이에 정확히 놓여 흐리게 표시됩니다. 스크린 크기의 쿼드가 텍스처 크기와 정확히 일치하는 한 괜찮습니다. 그러나 하위 이미지를 보여 주 자마자 재미있는 일이 발생합니다 (정확한 매핑을 파악하기 위해 독자에게 연습으로 남겨 둡니다; 힌트 : 0.5/dimension 및 (dimension - 1)/dimension이라는 용어가 있습니다. 솔루션 있음)

+0

질문 http://stackoverflow.com/questions/34952184/pixel-perfect-shader-in-unity 당신을 위해 쉬울 것입니다, DW! :영형 – Fattie