2011-09-08 3 views
0

여기 OpenGL을 배울 수있는 멍청한 멍청한 놈입니다. 게시 할 코드가 없습니다. 현재 구현하지 않은 개념에 대한 질문이기 때문에 게시 할 코드가 없습니다. 코드가 절대적으로 필요한 경우 알려 주시면 부끄러움을 표시하고 일부는 게시합니다.Texture_2D가 뷰포트보다 큰 뷰포트를 OpenGL에서 뷰포트로 축척하지 못하도록하는 방법

기본적으로 GL에 2D 이미지를 표시하는 VBO가 있습니다. 그러나 내 뷰포트가 800x600이고 이미지가 1024x1024이므로 이미지가 뷰포트 내부에 맞도록 축소됩니다. 나는이 문제에 대해 아주 오랫동안 봤는데, 이것들이 일어날 것이라고 말하는 NeHe 튜토리얼과 같은 것들에 대해서는 이것에 대한 언급이 있지만 일어날 수없는 이유와 이유에 대해서는 설명하지 않고있다. 나는 예방할 수 있다고 말한 하나의 포럼을 찾았지만 다시는 세부 사항이 없다고 생각합니다.

그래서 궁금합니다. 어떻게 할 수 있습니까? 나는이 분야에서 꽤 새로운 아기 멍청 아. 그래서 나는 GL을 배우고있다. 도움이된다면 저는 2D 게임을 만들고 있는데이 VBO를 사용하여 레벨의 배경 이미지를 표시하려고합니다. 따라서 카메라를 좌우로 움직이면 본질적으로이 배경 이미지를 스크롤 할 수 있습니다 . 어떤 도움이라도 대단히 감사 드리며 감사드립니다. :)

P.S. 또한 이것은 아마도 별개의 질문 일 것입니다 만, 버텍스/텍스처 맵의 좌표계를 설명하는 설명이나 링크도 잘 이해할 수 있습니다. 저는 실제로 텍스처를 0-1에서 매핑하고 그것을 공간의 픽셀 좌표로 변환하는 방법을 알지 못합니다.

UPDATE 좀 더 내가 찾은 유일한 해결책은 다음, 당신의 2D 텍스처의 크기보다 크거나 같아야 일시적으로 뷰포트를 조정하여 2D 텍스처를 그릴 것입니다 인터넷 검색, 다음을 설정 한 후, 그래서

좋아 뷰포트를 창 크기로 되돌립니다. 좋아요 :

//Set viewport so size of the current texture - note this is using a VBO 
glViewport(0, 0, 1024, 1024); 
glBindTexture(GL_TEXTURE_2D, texture); 

glDrawArrays(GL_QUADS, 0, 4); 

glPopAttrib(); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

glBindTexture(GL_TEXTURE_2D, 0); 

//Set the viewport back to the window size 
glViewport(0, 0, 800, 600); 

유일한 문제는 주요 해킹처럼 보입니다. 이것이 공식인가 수용 가능한 해결책입니까?

답변

0

가장 좋은 방법은 현재 뷰포트 크기로 그리는 정점을 축척하는 것입니다.

예를 들어 10px x 10px 상자 (오래된 API 무시)를 그리려면 다음과 같이하십시오.

glBegin(GL_QUADS); 
glVertex2d(0.0     ,0.0); 
glVertex2d(10.0/viewportWidth * 2,0.0); 
glVertex2d(10.0/viewportWidth * 2,10.0/viewportHeight * 2); 
glVertex2d(0.0     ,10.0/viewportHeight * 2); 
glEnd(); 

셰이더 또는 CPU에서 수행 할 수 있습니다.

뷰포트를 변경하면 값 비싼 OpenGL 상태가 변경되는 것처럼 보입니다.

참고 :. 이 더 복잡한 투영 행렬로 더 복잡 될 수 고무 시트 인 것으로

+0

답장을 보내 주셔서 감사합니다. 이 작업을 시도했지만 내 정점 데이터는 VBO에 저장되므로 VBO를 초기화 할 때 텍스처 너비를 뷰포트 너비로 나눈 크기에 따라 정점을 조정하려고했습니다. 아무 효과가없는 것 같았지만 느린 것을 변화시키는 뷰포트를 볼 수 있다는 것에 동의하기 때문에 또 하나의 샷을 제공 할 것입니다. –

+0

고마워요! 내가 바보라고 밝히고, 이전에 이것을 시도했을 때, 너비/높이 등을 명시 적으로 float로 정의하지 않았기 때문에 변환시 값을 반올림하여 전혀 작동하지 않게되었습니다. 다시 한번 고마워요! 내가 더 upvote 수 있기를 바랍니다. –

+1

뷰포트를 Chaning하는 것은 단지 정점 변환 프로세스에 영향을 미치는 4 개의 레지스터를 설정하기 때문에 값이 싸다. – datenwolf

1

생각해 텍스처 (I은 기본 -1 1로 가정). 텍스처의 왼쪽 아래 모서리 (픽셀이 아님)는 (0, 0)에 있고, 오른쪽 상단 모서리는 (1, 1)에 있습니다. 화면에 삼각형을 그릴 때 - 화면의 정확한 위치는 중요하지 않습니다. 텍스처 "고무 시트"는 텍스처 좌표에 따라 "잘라내어지고"텍스처 좌표로 지정된대로 삼각형 위로 늘어납니다. 뷰포트 치수와 텍스처 사이에 상호 작용이 없습니다!

텍스처가 있고 뷰포트가 허용하는 양만큼 왼쪽 아래 부분을 표시하려고한다고 가정 해보십시오.그러면 다음과 같이 할 수 있습니다.

void display() 
{ 
    glViewport(0, 0, viewport_width, viewport_height); 
    /* ... */ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    /* By using a orthographic projection with limits matching the viewport 
     we're effectively getting viewport pixel coordinates for the vertices. */ 
    glOrtho(0, viewport_width, 0, viewport_height, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    /* I'm using immediate mode here for clarity – not 
     recommended for new applications, use Vertex Arrays */ 
    glBegin(GL_QUADS); 

    glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(texture_width, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f(texture_width, texture_height); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0, texture_height); 

    glEnd(); 
} 

키는 투영을 필요에 따라 변경하는 것입니다. OpenGL 프로젝션 매트릭스는 만지지 않아야하는 신성한 데이터 조각이 아닙니다. 실제로 일을 쉽게해야한다는 것을 알 때마다 수정해야합니다. 행렬을 변경하는 것은 저렴합니다. 뷰포트에서도 마찬가지입니다. 그것들은 거의 자유롭게 설정할 수있는 일련의 레지스터들입니다 (셰이더와 관련하여 유니폼이라고 함).

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 조금 더 명확히 할 수 있습니까? 나에게 그것은 두 개의 모순 된 진술처럼 보인다. 맨 위에서 뷰포트 차원은 텍스처링과 관련이 없지만 내 자신의 경험에서 볼 때 뷰포트가 2D 텍스처 개체보다 작 으면 뷰포트의 크기를 조정하는 것처럼 보일 것입니다. 그런 다음 답변이 끝나면 무거운 작업이 아니기 때문에 필요에 따라 뷰포트를 수정해야한다고 말합니다. 다른 답변에서 언급 한 것처럼 픽셀 대 gl 좌표 변환을 기반으로 정점 데이터를 설정해서는 안된다는 말입니까? –

+0

뷰포트가 창 좌표의 지오메트리보다 작 으면 지오메트리가 잘립니다. 크기 조정이 적용되지 않습니다. 내 코드를 자세히 보면 클립 공간과 픽셀 좌표 간의 관계가 투영 행렬에 의해 설정됩니다. 버텍스 위치는 일정합니다. 음, 텍스처의 크기와 일치하지만, 텍스처 크기는 일정하다고 가정 할 수 있습니다. 실제로는 ID 모델 뷰 공간 XY가 (뷰포트) 픽셀과 일치하고 정점 위치에 더 이상의 동적 수정을 적용하지 않도록 프로젝션을 수정하는 것이 좋습니다. – datenwolf

관련 문제