2013-06-10 6 views
2

SDL 및 OpenGL을 사용하는 방법을 배우고 있습니다. SDLTutorials.com에서 자습서를 읽었습니다. 나는 이제 물건을 더 가져 가고 응용 프로그램의 로딩 화면을 만들려고합니다. oop 메뉴 시스템.SDL OpenGL 렌더링 문제

나는 실제 상황을 간단하게 테스트하기 시작했습니다. 텍스처 클래스를 통해 수행되는 윈도우의 주 배경이 있습니다. 두 개의 관련 기능이 여기에 정의되어

void Texture::Bind() { 
    glBindTexture(GL_TEXTURE_2D, TextureID); 
} 

void Texture::RenderQuad(int X, int Y, int Width, int Height) { 
Bind(); 

    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); glVertex3f(X, Y, 0); 
     glTexCoord2f(1, 0); glVertex3f(X + Width, Y, 0); 
     glTexCoord2f(1, 1); glVertex3f(X + Width, Y + Height, 0); 
     glTexCoord2f(0, 1); glVertex3f(X, Y + Height, 0); 
    glEnd(); 
} 
나는 또한 클릭 버튼 또는 편집 상자와 같은 것입니다 기본적으로 개발하기 위해 시스템 및 클래스에서 만든 메뉴의 부모가 될 것입니다 메뉴 클래스를 만들었습니다

. 지금까지 Menu 클래스의 유일한 관련 함수는 다음과 같습니다.

void Menu::OnRender() { 
    if(Visible) { 
     if(MenuTexture == NULL) { 
      glColor4f(1.,G,B,A); 
      glBegin(GL_QUADS); 
       glVertex2d(X, Y); 
       glVertex2d(X+Width,Y); 
       glVertex2d(X+Width,Y+Height); 
       glVertex2d(X,Y+Height); 
      glEnd(); 
     }else{ 
      MenuTexture->RenderQuad(X,Y,Width,Height); 
     } 
    } 
} 

마지막으로 내 응용 프로그램은 전체 윈도우에 바인딩되는 하나의 텍스처를 만들었습니다. 즉, 상기 백 워드.

void App::OnRender() { 


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 


    MainScreen.RenderQuad(0,0,winWidth,winHeight); //Texture Object with bkg.jpg 
    MainMenu.OnRender(); //Menu object to be 150x300 and all black 


    SDL_GL_SwapBuffers(); 
} 

그런 다음 메뉴 항목을 만들고 배경 위에 그려 봅니다. 초기화 된 색상을 검정색으로두면 전체 화면이 거의 즉시 검정색으로 바뀝니다. 즉, 메뉴가 그려지는 첫 번째 프레임이 한 프레임, 검은 색 사각형이 검정색으로 배치 된 다음 검정색으로 바뀝니다. 1.0이면 빨강 색으로 표시됩니다. 그러면 전체 그림에 빨간색 필터가 표시되고 메뉴 상자에 불투명 한 빨간색 사각형이 그려집니다.

나는 몇 가지 예제를 통해 렌더링을 해왔지만 뭔가를 놓치고 있어야합니다. 근본적으로, 우리가 행해지는 것의 라인에 모두 넣으면 텍스처를 서페이스에 바인딩하고 서페이스와 텍스처 바인딩의 좌표를 정의합니다. 그런 다음 쿼드를 렌더링합니다. glBegin() 내 메뉴에 색상 호출을 넣었습니다. 4 개의 꼭지점 모두에서 색상을 정의했습니다.

내 대답에 감사 : 이것은 문제를 해결했습니다. 그러나, Menu 객체를 반환하기 전까지 Menu 객체를 올바른 색상으로 렌더링하지 않았습니다. 잘 모르겠다. 나는 그것에 대해 배우고 이것에 대해 배우고 읽을 것이다. 고맙습니다!

[통해서 문제를 해결할] 변경은 App::OnRender() 제작 :

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
MainScreen.RenderQuad(0,0,winWidth,winHeight); 

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
MainMenu.OnRender(); 

답변

1

GL_TEXTURE_ENV_MODE 기본값을 현재의 컬러에 의해 수신 텍셀 값을 곱하고 GL_MODULATE한다.

현재 색상이 검은 색 (RGB(0,0,0))이면 모든 질감이 검은 색으로 렌더링됩니다. 단일 채널 색상과 동일 : RGB(1,0,0) * RGB(x,y,z) == RGB(x,0,0).

GL_DECAL을 사용해보세요.