Функция визуализации, которую вы вызываете, нарисует свою форму поверх того, что уже нарисовано.
Это верно.
Я обнаружил, что этокажется, что это не так:
Это работает для меня:
#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 и функциональный , но минимальный пример, иллюстрирующий вашу проблему.«Забывать» публиковать этот пример - плохая идея.