OpenGL рендеринг спереди - PullRequest
       15

OpenGL рендеринг спереди

1 голос
/ 25 марта 2012

Мое понимание рендеринга OpenGL заключалось в том, что без теста глубины объекты будут отрисовываться в последовательном порядке, так что последняя вызванная вами функция рендеринга будет рисовать свою форму поверх того, что уже было нарисовано.Я обнаружил, что, похоже, это не тот случай:

glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);


glColor3f(1.0, 0.0, 0.0);
glBegin(GL_QUADS);
{
    glVertex2f(50, 50);
    glVertex2f(100, 50);
    glVertex2f(100, 100);
    glVertex2f(50, 100);
}
glEnd();


glColor3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
{
    glVertex2f(30, 60);
    glVertex2f(110, 60);
    glVertex2f(110, 90);
    glVertex2f(30, 90);
}
glEnd();

Вместо красного квадрата под синим квадратом, что, как я ожидаю, эти вызовы дают мне красный квадрат над синим квадратом!

Разве я не понимаю, как работает рендеринг OpenGL?Или я просто пропускаю какую-то опцию или конфигурацию, которая не позволяет синему квадрату визуализироваться?Я использую пользовательский (но очень простой) шейдер, это что-нибудь изменит?

Непринятый ответ на этот вопрос, по-видимому, подразумевает, что последовательный рендеринг на самом деле не происходит изависит от реализации, но принятый ответ подразумевает, что это действительно так.

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

1 Ответ

4 голосов
/ 25 марта 2012

Функция визуализации, которую вы вызываете, нарисует свою форму поверх того, что уже нарисовано.

Это верно.

Я обнаружил, что этокажется, что это не так:

Это работает для меня:

#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>

static int scrWidth = 640;
static int scrHeight = 480;

int main(int argc, char** argv){
    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);

    if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){
        fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480);
        SDL_Quit();
        return -1;
    }
    glewInit();

    SDL_ShowCursor(SDL_DISABLE);

    glClearColor(0.2, 0.2, 0.2, 0.2);
    glClearDepth(1.0);

    glEnable(GL_DEPTH_TEST);

    bool running = true;
    while (running){
        SDL_Event event;
        if (SDL_PollEvent(&event)){
            switch(event.type){
                case SDL_QUIT:
                    running = false;
                    break;
            };
        }
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, scrWidth, scrHeight, 0);

        glColor3f(1.0f, 0.0f, 0.0f);
        glBegin(GL_QUADS);
        glVertex2f(50, 50);
        glVertex2f(100, 50);
        glVertex2f(100, 100);
        glVertex2f(50, 100);
        glEnd();


        glColor3f(0.0, 0.0, 1.0);
        glBegin(GL_QUADS);
        glVertex2f(30, 60);
        glVertex2f(110, 60);
        glVertex2f(110, 90);
        glVertex2f(30, 90);
        glEnd();

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glFlush();
        SDL_GL_SwapBuffers();       
    }   

    SDL_Quit();
    return 0;
}

Сравните с вашим кодом и посмотрите, есть ли разница.Возможно, вы не отключили тест глубины.Вы также можете получить ту же проблему, если будете использовать буфер трафарета в своем коде с определенными комбинациями параметров буфера трафарета (что-то вроде glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);).Вы также можете получить тот же эффект, если забудете использовать glClear и вставить вызов «swap buffers» между первым и вторым полигоном.

Я использую пользовательский (но очень простой) шейдер, это изменит что-нибудь?

Да, это может изменить все.Однако в этом случае это означает, что вы не предоставили достаточно информации, чтобы помочь вам решить вашу проблему.Если вам нужна помощь с кодом, вы должны опубликовать complete и функциональный , но минимальный пример, иллюстрирующий вашу проблему.«Забывать» публиковать этот пример - плохая идея.

...