SDL2-Opengl 3.3+ что с ним не так?

Вот мой код:

int main(int argc, char* argv[]) {

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        return false;
    }
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 ) ;
    SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 4 ) ;
     if((window = SDL_CreateWindow("SDL opengl",100,100,640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN)) == NULL) {
        return false;
    }
    maincontext = SDL_GL_CreateContext(window);
    SDL_GL_SetSwapInterval(0);
    glewExperimental=true;
    GLenum err=glewInit();

    Chapter* chapter1 = new Chapter();
    chapter1->init();

    glClearColor(0.0,0.0,0.0,1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,640.0/480.0,1.0,500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    SDL_Event Event;

    while(Running) {

        while(SDL_PollEvent(&Event)) {
            event_update(&Event);
        }
        //main loop

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(1.0f, 1.0f, 1.0f);

        glBegin(GL_TRIANGLES);
            glVertex3f(0.0f, 1.0f, 0.0f);
            glVertex3f(-1.0f, -1.0f, 0.0f);
            glVertex3f(1.0f, -1.0f, 0.0f);
        glEnd();

        glTranslatef(3.0f, 0.0f, 0.0f);

        glBegin(GL_QUADS);
            glVertex3f(-1.0f, 1.0f, 0.0f);
            glVertex3f(1.0f, 1.0f, 0.0f);
            glVertex3f(1.0f, -1.0f, 0.0f);
            glVertex3f(-1.0f, -1.0f, 0.0f);
        glEnd();
        SDL_GL_SwapWindow(window);

    }
    return 0;
}

А у меня проблема в том, что больше ничего не видно только очищенный цвет. В чем может быть проблема? (и когда я инициализирую, нет ошибки или чего-то еще) Я использую Visual Stuido 2010, если это важно.


person Csoki    schedule 06.12.2013    source источник
comment
Я не знаю, в чем проблема, извините. Но я бы предложил две вещи: одна — проверять glError после каждого вызова, чтобы увидеть, не сработал ли какой-либо из них. Другой - установить чистый цвет на что-то отличное от черного, если вы рисуете успешно, но черным...   -  person jcoder    schedule 06.12.2013
comment
когда я очищаю цвет до белого, чем все белое, так что это работает, но геометрия нет. :(   -  person Csoki    schedule 06.12.2013
comment
Возможно, вы не сможете использовать фиксированный конвейер функций. То есть у вас есть (3.3) прямой совместимый контекст.   -  person Brett Hale    schedule 06.12.2013
comment
Вероятно, вы столкнулись с этой ошибкой: bugzilla.libsdl.org/show_bug.cgi?id=2279 Попробуйте удалить SDL_GL_MULTISAMPLEBUFFERS/SDL_GL_MULTISAMPLESAMPLES, чтобы проверить, не в этом ли проблема.   -  person gabomdq    schedule 06.12.2013
comment
Удалил, но все равно ничего :(   -  person Csoki    schedule 06.12.2013
comment
Какую версию glew вы используете? Я пытаюсь заставить его работать с GLew 1.10, но безуспешно.   -  person    schedule 23.03.2014


Ответы (1)


Судя по всему, у вас ближняя плоскость отсечения равна 1,0, а дальняя плоскость отсечения — 500,0.

но вы рисуете на z-расстоянии 0,0

Я бы попытался переместить рисунок в область усечения (то есть в диапазон [1,0, 500,0]), чтобы посмотреть, сможете ли вы сделать свою геометрию видимой в качестве первого шага.

glVertex3f (x, y, z); // here your z value is 0, I suggest this could be the problem.

Я подумал, что могу подробнее остановиться здесь, так как раньше у меня не было много времени.

Когда вы делаете glTranslate... в своем коде обновления, это будет вызываться один раз при каждом обновлении, что довольно часто можно предположить, в результате чего ваша геометрия перемещается на 3 единицы по оси X каждый раз, когда она вызывается (т.е., вероятно, не то, что вы имели в виду) . Вместо этого я бы предложил нажать матрицу, чтобы выполнить это преобразование, и вытолкнуть ее, когда вы закончите перевод. OpenGL предоставляет матричный стек, поэтому в основном то, что вы делаете, когда вы нажимаете матрицу, заключается в том, что вы «сохраняете ее на потом», затем вы выполняете свои преобразования и рендеринг, затем выталкиваете матрицу, в результате чего вы возвращаетесь к началу. Таким образом, вы не будете переводить свою матрицу на новое расстояние при каждом обновлении, а скорее будете перемещать свою матрицу из исходного положения в позиции, где вы хотите рисовать при каждом обновлении.

Поэтому я предлагаю изменить ваш код на что-то вроде этого для основного цикла:

//main loop
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);

/* push the current state of the matrix (i.e. store it so we don't make the mentioned change per update */
glPushMatrix();
/* think of it as moving your camera, you positioned your camera (frustum) at origo looking at everything inside a frustum shape one unit in front of the camera to 500 units in front of the camera, at an angle and so on.. so we want to draw our triangle to the left (from your view) 3 units and 10 units into the screen */
glTranslate3f(-3.0f, 0.0f, -10.0f);
glBegin(GL_TRIANGLES);
    glVertex3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

/* translate again, i.e. "move your camera" this time 6 units to the right, 3 units to compensate for the move you did to draw your triangle, and 3 units to place it in the right end. this time we do not move it in the z-axis, because we are already 10 pixels into the screen. */
glTranslatef(6.0f, 0.0f, 0.0f);

glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();
/* pop the matrix changes we made with glTranslatef, so that we are back at the origo looking down negative z-axis so that the next draw-call we will again go 3 units left, 10 units down the z-axis and draw a triangle and so on.. hope it makes sense */
glPopMatrix();
SDL_GL_SwapWindow(window);

Я надеюсь, что это, по крайней мере, поможет вам сделать что-то видимым! Если все это покажется неясным, я могу попытаться объяснить это немного подробнее, но, надеюсь, это отрисовывается таким образом, чтобы вы могли немного поиграть с ним и почувствовать, как это сочетается друг с другом.

person qrikko    schedule 06.12.2013
comment
Все еще неправильно :( Я поменял на gluPerspective(45.0,640.0/480.0,0,500.0); но все равно не лучше - person Csoki; 06.12.2013
comment
У вас не может быть близкого к нулю расстояния отсечения, эта математика не работает... Попробуйте перевести треугольники обратно в плоскости z на 2 единицы или что-то в этом роде (просто для отладки, я имею в виду...) - person jcoder; 06.12.2013
comment
Обновлен ответ с дополнительной информацией, которая, надеюсь, даст решение проблемы иммиграции, когда ничего не видно, и я также попытался придать ей больше глубины, чтобы, возможно, вы могли понять, как заставить ее работать. - person qrikko; 07.12.2013
comment
Разве фиксированный конвейер функций не устарел в OpenGL 3.3? Вы хотите создать контекст профиля совместимости вместо контекста основного профиля, чтобы использовать блок glBegin() ... glEnd() в старом стиле. - person Kh40tiK; 02.05.2014