2016-11-27 10 views
-1

이렇게 잠시 동안 해결책을 찾고 있었지만 꽤 오래되었습니다. 내 문제는 SDL을 초기화하고 오류없이 창을 띄운 후에 창이 열리 며 1, 0 또는 -1 이외의 다른 Z는 렌더링되지 않습니다. 또한 Z를이 세 가지 값 중 하나로 설정해도 아무 것도 수행하지 않습니다. 여기 내 코드가있다. 나는 glew와 sdl을 헤더에 포함 시켰고 loop 메서드는 주요 프로그램 루프입니다.OpenGL + SDL + glew는 초기화가 성공적으로 완료된 후 아무 것도 그려지지 않습니다.

#include "Controller.h" 

int Controller::loop() { 
    // Initialize 
    if(!init()) 
     return -1; 

    SDL_Event _event; 

    // Main loop 
    while(_running) { 
     // Loop through all input 
     while(SDL_PollEvent(&_event)) 
      event(_event); 
     // Game logic 
     step(); 
     // Game drawing 
     draw(); 
    } 

    // End game 
    end(); 
    return 0; 
} 

bool Controller::init() { 
    // Initialize SDL 
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) 
     return false; 

    // Create window 
    if ((_mainWindow = SDL_CreateWindow("GAME", 200, 200, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL)) == NULL) 
     return false; 

    // Create context 
    _mainContext = SDL_GL_CreateContext(_mainWindow); 

    // Make it active 
    SDL_GL_MakeCurrent(_mainWindow, _mainContext); 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); 

    // Initialize glew 
    glewExperimental = GL_TRUE; 
    if (glewInit() != 0) 
     return false; 

    return true; 
} 

void Controller::event(SDL_Event& _event) { 
    switch(_event.type) { 
    case SDL_KEYDOWN: 
     switch (_event.key.keysym.sym) { 
     case SDLK_ESCAPE: 
      _running = false; 
      break; 
     default: 
      std::cout << "Key has been pressed." << std::endl; 
     } 
    default: 
     break; 
    } 
    _world[_currentWorld].event(_event); 
} 

void Controller::step() { 
    _world[_currentWorld].step(); 
} 

void Controller::draw() { 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3f(1.0f, 0.0f, 0.0f); 

    glBegin(GL_TRIANGLES); 

    glVertex3f(-1.0f, -0.5f, -4.0f); // A 
    glVertex3f(1.0f, -0.5f, -4.0f); // B 
    glVertex3f(0.0f, 0.5f, -4.0f); // C 

    glEnd(); 

    //_world[_currentWorld].draw(); 
    SDL_GL_SwapWindow(_mainWindow); 
} 

void Controller::end() { 
    SDL_GL_DeleteContext(_mainContext); 
    SDL_DestroyWindow(_mainWindow); 
    SDL_Quit(); 
} 

답변

2

0, -1 이외의 다른 Z는 렌더링되지 않습니다.

OpenGL을 정규화 장치의 좌표계에 시청 볼륨 모든 삼차원 따라 -1 1가는 단지 정규화 입방체이다.

변형을 적용하지 않으므로 기본적으로 NDC 공간을 직접 그립니다 (실제로는 클립 공간이되지만 입력 w 좌표가 모든면에 동일하고 기본 값은 1입니다.). 결과적으로 z를 < -1.0 또는> 1.0으로 설정하면 정점이보기 볼륨 외부에있게됩니다. 0.0 사이뿐만 아니라 그 사이의 모든 값이 작동해야합니다.

또한 Z를 세 값 중 하나로 설정해도 아무 것도 수행하지 않습니다.

나는 그 질문을 올바르게 이해하고 있다고 확신하지는 않습니다. 나는 당신이 z를 따라 멀리 떨어 뜨릴수록 물체가 작아 져야한다고 생각합니다. 그러나 GL은 항상은 xy 평면에서 단순히 래스터 화하여 직교 (비 원근 투영) 투영을 수행합니다. 원근감 효과를 원한다면 약간의 perspectivee 변형을 수행해야하며, 일반적으로 4x4 균질 투영 행렬을 통해 수행됩니다.

OpenGL 또는 D3D와 같은 렌더링 API를 사용하기 전에 먼저 선형 대수학 및 동질 공간/투영 변환의 기초를 배우는 것이 좋습니다. 당신은 당신이 다음 번에 수행 할 작업에는 영향을주지 않습니다 문맥, (그것은 단지 SDL을 알려드립니다을 만들어 후 GL 컨텍스트 버전 을 요청

:

또한, 코드와 몇 가지 문제가 있습니다 그것은 GL 컨텍스트를 생성합니다). 당신은 또한 "현대"OpenGL 버전 3.3을 요구하는 것 같습니다. 그러나 드로잉에 사용하는 코드는 이며 현대 GL에서는이며 코어 프로파일에서는 이러한 기능이 완전히 제거되었습니다. 요즘 GL 학습을 시작한다면 20 년 전의 구식 낡은 것이 아니라 현대 OpenGL을 배우는 것이 좋습니다. this tutorial을 살펴보고, 수학의 몇 가지 측면을 다룹니다.

+0

답변 해 주셔서 감사합니다. 이 코드를 여러 자습서에서 모아 두었습니다. 아무 것도 알 필요가없는 모든 것을 발견했습니다. Z 속성의 범위는 0부터 1까지입니다. 저는 삼각형을 그릴 수 있기 전에 변형을 원합니다. 그리고 제가 찾은 모든 자습서는이 오래된 스타일의 그림이었습니다. –

1

변환 매트릭스가 없습니다. 따라서 가시적 인 z의 범위는 [-1, 1]이다. 이 값을 지정하면 해당 부분이 잘립니다 (표시되지 않습니다).