2013-07-02 2 views
0

Iam пытается написать небольшую OPENGL программу для рисования одного треугольника, используя только Vertex Buffer Objects (без использования ВАО) s, но всякий раз, когда я хочу, чтобы скомпилировать его, он только показывает синий экранOpenGL Drawing с VBO

Здесь мой код

#include <iostream> 
#include <GLUT/glut.h> 
#include <OpenGL/gl3.h> 

GLuint VBO; 
GLuint VAO; 

void display(); 

float vertex[] = {-1.0, 0.0 , 0.0, 
        0.0 , 1.0 , 0.0 , 
        1.0 , 0.0 , 0.0 }; 

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

{ 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE); 
glutInitWindowSize(1000, 400); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("My First GLUT/OpenGL Window"); 
glutDisplayFunc(display); 
glutMainLoop(); 
return 0; 
} 

void display() 

{ 
glClearColor(0, 0, 1,1); 
glClear(GL_COLOR_BUFFER_BIT); 

glGenBuffers(1,&VBO); 
glBindBuffer(GL_ARRAY_BUFFER, VBO); 
glBufferData(GL_ARRAY_BUFFER,9 *sizeof(vertex),vertex, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 

glVertexAttribPointer(0, 3,GL_FLOAT, GL_TRUE, 0, 0); 


glDrawArrays(GL_TRIANGLES, 0, 3); 

glDisableVertexAttribArray(0); 

glutSwapBuffers(); 
}; 
+0

Где ваши шейдеры? В качестве альтернативы, почему вы не используете 'glVertexPointer()'? – genpfault

+0

Iam new для программирования Opengl, и я хотел изучить различные способы рисования с помощью opengl, поэтому, следуя некоторым онлайн-учебникам (которые не охватывали каждый бит программы), я придумал этот код, хотя я знаю, что мы должны предоставить наши шейдерные программы .. – BulBul

ответ

2

три проблемы:

  • Ваш код пропускает настройки окна просмотра (если окно случается быть созданы с размером 0 × 0, и получает менять только позже начальный размер видового экрана будет 0 × 0).

  • Ваше использование оператора sizeof неверно. vertex - это статически выделенный массив, и поэтому оператор sizeof вернет общий размер массива вершин, а не только размер одного элемента. Поэтому в этом конкретном случае достаточно всего лишь sizeof(vertex) без его умножения на 9.

И последнее, но не в последнюю очередь, и истинная причина вашей проблемы:

  • Где ваши шейдеры? Используя общие атрибуты вершин и, конечно же, обязательные для OpenGL-3, вы должны предоставить действительную комбинацию вершинного и фрагментарного шейдера. Без них ничего не изменится.
+0

на самом деле я подошел ко всем этим проблемам из интернет-учебников, есть несколько учебников, которые умножают оператор sizeof на константу, и относительно шейдеров я уже знаю, что шейдеры вершин и фрагментов являются обязательными, но, как я уже упоминал об этом раньше некоторые онлайн-уроки, в которых не упоминаются все аспекты программы, я думал, что, не указав шейдер, мы позволяем OpenGl использовать какие-то стандартные шейдерные программы, возможно, как простой проходной шейдер: P, в любом случае спасибо для вашего ответа. – BulBul

+0

@BulBul: в OpenGL нет шейдера по умолчанию. Используя OpenGL-2 и используя не общие атрибуты вершин (glVertexPointer, glNormalPointer, glEnableClientState (GL_VERTEX_ARRAY) и т. Д.), Вы можете по умолчанию использовать конвейер фиксированной функции. Что касается оператора sizeof, я полагаю, что упоминаемый вами учебник написал что-то вроде 'sizeof (v [0])' или 'sizeof (* v)' и работал на указателе, а не на статически выделенном массиве. Поскольку вы не знали об этой тонкости, я настоятельно рекомендую вам отполировать свои знания на C/C++. – datenwolf

+0

из определения одной из книг программирования C, которые я прочитал, гласит, что >>> имя массива (без указания индекса) является указателем на первый элемент в этом массиве, например: «vertex», эквивалентный «vertex [0]», но, похоже, оператор sizeof() работает совершенно иначе, чем я ожидал. – BulBul