SFML을 사용하여 OpenGL 용 텍스처를 어떻게로드합니까?


답변:


16

빠른 것은 무료로 제공되고 쉬운 것은 어려운 OpenGL에 오신 것을 환영합니다.

샘플이 길고 복잡하다고 생각했다면, "텍스처를로드하기위한 것"인데 아직 아무것도 보지 못했습니다. DDS 텍스처로드, HDR 텍스처 처리, 큐브 맵 지원, 텍스처 렌더링 등이 필요할 때까지 기다리십시오.

OpenGL에서 텍스처로드는 두 가지 구성 요소로 구성됩니다.

  • 이미지 형식에서 데이터 가져 오기 파일에서 텍스처를로드하거나 절차 적으로 생성 할 수 있습니다. 멋진 색상 정보 배열로 끝나는 한 중요하지 않습니다.

  • 비디오 카드에 데이터를 넣습니다. 데이터는 시스템 RAM에서 비디오 RAM으로 이동해야합니다.

SFML에는 표준 이미지 로더가 제공되므로 첫 번째 부분은 쉬워야합니다.

sf::Image img_data;
if (!img_data.LoadFromFile("images/avatar.png"))
{
    LOG_ERROR("Could not load '%s'.", "images/avatar.png");
    return false;
}

다음으로 OpenGL 텍스처 오브젝트를 생성해야합니다.

GLuint texture_handle;
glGenTextures(1, &texture_handle);

텍스처 바인딩에 대한 여러 가지 선택이 있습니다. 세 가지 주요 유형 인 1D, 2D 및 3D가 있으며 큐브 맵 (+ X, -X, + Y, -Y, + Z, -Z)을 지원합니다. 그러나 99 %의 경우 2D 텍스처가 필요합니다.

glBindTexture(GL_TEXTURE_2D, texture_handle);

이제 우리는 흥미로운 부분에 도달합니다. 데이터를 비디오 카드에 업로드합시다.

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    img_data.GetWidth(), img_data.GetHeight(),
    0,
    GL_RGBA, GL_UNSIGNED_BYTE, img_data.GetPixelsPtr()
);

마지막으로 많은 텍스처 매개 변수를 설정할 수 있습니다. 이 질문에 대한 답은 : (0.0, 1.0) 범위를 벗어난 텍스처 좌표를 사용하면 어떻게됩니까? 우리는 포장 GL_REPEAT하거나 ( ) 아니면 아무것도하지 GL_CLAMP않습니까 ( )? 텍스처에 선형 보간을 사용하려는 비디오 카드를 설명하는 데 사용할 수도 있습니다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

이제 텍스처를 사용하여 텍스처를 바인딩 glBindTexture하고 텍스처 메시를 그릴 수 있습니다.


mmm, 나는 그것을 시도하고 내가 얻는 모든 것은 흰색 큐브입니다 : pastebin.com/nVQFAMRJ
Darestium

glEnable(GL_TEXTURE2D);초기화 기능을 넣어보십시오 .
knight666

굉장 해요! 감사! BTW, 그 기능은 무엇입니까? 텍스처링을 사용 하시겠습니까?
Darestium

예, 2D 텍스처 오브젝트를 켜서 텍스처 데이터를받을 수 있습니다. 초기화시 한 번만 활성화하면되지만 코드를 새 프로젝트에 복사 할 때 종종 잊어 버립니다. 자신도 포함되었습니다. ;)
knight666

아주 좋은 설명입니다. 당신은 자습서를 작성할 수 있습니다!
danijar

2

SFML 2.0+를 사용하면 텍스쳐를 더 쉽게로드 할 수 있습니다.

sf::Texture texLid;
std::string image2="images/top.jpg";
if (!texLid.loadFromFile(image2))
{
    std::cout << "Could not load" << image2;
    char c;
    std::cin>>c;
    return false;
}


glEnable(GL_TEXTURE_2D);//tell OpenGL to use textures when drawing

sf::Texture::bind(&texLid);//select this texture for OpenGL rendering
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.