Я довольно новичок в OpenGL, и все мои знания приходят из учебников в Интернете. Сейчас я могу запрограммировать вращающийся куб, освещенный точечным источником. Моя новая цель — реализовать сглаживание — возможно, без каких-либо магических методов, таких как гипотетический glEnable(Smooth_Lines)
функция. Метод, который я использую в настоящее время, не работает.
Моей первой попыткой было попробовать glAccum
работать и реализовывать сглаживание дрожания — я не знаю, возможно ли это на моей видеокарте Radeon, или я просто написал что-то не так.
Моя вторая попытка заключается в использовании glGenFrameBuffers
(и остальная часть семьи). Но сейчас (после ~ 10 часов исследований) у меня просто нет сил продолжать. Можете ли вы сказать мне, где я должен реализовать процесс сглаживания? Или какие функции я должен использовать? Вот сокращенная версия всего моего кода:
class Window;
static Window* ptr;
class Window{GLuint vbo[4],program;
GLint att[5],mvp,mvp2;
void init_res(){
a0=glutGet(GLUT_ELAPSED_TIME);
GLfloat cube[]= ... something
GLfloat colors[]= ... still something
GLushort elements[]= ... oh you can just guess how it should look :)
//now I am binding buffers and send cube data to shaders
program=glCreateProgram();
//little more code here
}
void Draw(){
// here is subfunction for drawing all cube.
}
void onDisplay(){
//here is main function which is send to glutDisplayFunc
Draw();
//should I add something here?
glutSwapBuffers();
}
Window(int s_w,int s_h){
glutInit(&ac, av);
glutInitDisplayMode(GLUT_RGBA|GLUT_ALPHA|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(s_w, s_h);
glutCreateWindow("My Rotating Cube");
glewInit();
init_res();
ptr=this;
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutIdleFunc(Idle);
glutKeyboardFunc(Key);
glEnable(GL_LINE_SMOOTH_HINT);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glEnable(GL_BLEND);
glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_MULTISAMPLE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//here is a lot of garbage - you can call it 'voodoo programming'
glutMainLoop();
free_resources();
}
};
int main(int argc, char** argv){
ac=argc;
av=argv;
Window *okno;
okno = new Window(800,600);
}
На данный момент все в этой программе работает (ну, конечно, до сокращений: P). Я не прикреплял шейдеры — они настолько просты, насколько это возможно (с подсветкой и добавленными границами куба).
Есть идеи, как реализовать сглаживание здесь?
Задача ещё не решена.