2013-04-02 3 views
-2

Я создал программу, которая использует старые функции (vertexpointer), и я хочу сделать ее быстрее с помощью современных функций.
Я думаю, что я должен создать чистый, новый, но я думал, что могу задать этот вопрос здесь, прежде чем создать новый.
Я попытался подставить одну из функций рисования, а остальные пошли не так!Как создать современную программу без шейдеров?

функция инициализации:

glGenBuffers(10,vbo); 
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]); 
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*vertSize,vert,GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER,vbo[1]); 
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*normalsSize,normals,GL_DYNAMIC_DRAW); 
glGenVertexArrays(1,&vao); 
glBindVertexArray(vao); 
glEnableVertexAttribArray(pSlot); 
glEnableVertexAttribArray(nSlot); 
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]); 
glVertexAttribPointer(pSlot,3,GL_FLOAT,GL_FALSE,0,0); 
glBindBuffer(GL_ARRAY_BUFFER,vbo[1]); 
glVertexAttribPointer(nSlot,3,GL_FLOAT,GL_FALSE,0,0); 

Я понятия не имею о розыгрыше ...

я должен использовать эти:

glBindAttribLocation(prog, pSlot, "inVer"); 
glBindAttribLocation(prog, nSlot, "inNorm"); 

но принимает параметр prog.

Проблема заключается в том, что я должен переписать всю программу, если я использую шейдеры, если я ошибаюсь, скажите мне, как создавать шейдеры, не создавая формы для матрицы прогноза, матрицы модели и напрямую использовать матричный стек, пожалуйста ,

Так что же самое новое, что я должен использовать, только создавая init func, изменяя функцию func, но не используя шейдеры? Если это avialable, то какова ценность pSlot и nSlot? (Я думал, что 0 и 2, потому что старые gl_Vertex и gl_normal (или что-то в этом роде) в шейдерах используют эти числа)

+3

В современном OpenGL вам необходимо реализовать шейдеры. Об этом нет. – datenwolf

+0

Я знаю, но не тот современный openGL, немного менее современный. Если это абсолютно неувядаемо, то что нового в openGL, что не нужно использовать? – radl

+2

Ну, если все, что вы хотите, не использует немедленный режим, а Vertex Arrays, то вы вряд ли сможете рассказать об этом современном OpenGL. Вершинные массивы доступны уже более 15 лет. Если вы хотите использовать общие атрибуты вершин, то вы также должны указать OpenGL, как обрабатывать эти атрибуты, а это значит писать шейдер. И позже будет современно. – datenwolf

ответ

4

Если вы игнорируете шейдеры, то вы застряли с атрибутами вершин до 3.0 (позиция , цвет, нормальный, texcoords, индекс цвета). Вы должны использовать glVertexPointer, glColorPointer, glNormalPointer и семью, а не общим glVertexAttribPointer. Вам не нужно использовать glBindAttribLocation, поскольку общие (нумерованные) атрибуты предназначены для шейдеров.

Вы уже используете буферные объекты, что очень хорошо для производительности.

Функции рисования (glDrawArrays *, gl (Multi) DrawElements *) выглядят одинаково для фиксированной функции и. Профиль совместимости должен позволить вам уйти с фиксированной функцией и использовать функции GL3, такие как instancing.

Зачем это? Понятия не имею; шейдеры упрощающие так много ...

+0

Спасибо! Я думал, что смогу немного модернизировать свою программу с небольшими изменениями. Мне нужно было бы выбросить матричный стек, и так много всего ... – radl

+0

Что именно вы хотите модернизировать о своей программе, если вы в порядке с использованием фиксированной функции? – Kos

+0

Я хочу скопировать на GPU данные в начале программы. – radl

3

Я думал, что кто-то дал бы официальный answer.But здесь:

Нет, вы не можете использовать современные (программируемый) OpenGL без шейдеров.