Проблема с получением простого VBO для работы на Mac - PullRequest
1 голос
/ 11 июня 2011

Я пытаюсь переработать принятый ответ на этот вопрос для работы в приложении Какао.

Я создал класс под названием OpenGLView, который является подклассом NSOpenGLView, и в моем Xib-файле у меня есть представление OpenGL с пользовательским классом OpenGLView.

И я создал реализацию класса OpenGLViewследующее:

#import "OpenGLView.h"
#include <OpenGL/OpenGL.h>
#include <OpenCL/OpenCL.h>

@implementation OpenGLView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (void)drawRect:(NSRect)dirtyRect
{    
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glShadeModel(GL_FLAT);
    glEnableClientState(GL_VERTEX_ARRAY);
    float data[][2] = {{50,50},{100,50},{75,100}};
    glGenBuffers(1,&ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f,0.0f,0.0f);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glVertexPointer(3, GL_FLOAT, 3*sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES,0,3);
    glFlush(); 

}

@end

В основном (за исключением glewInit()) я скопировал метод init, скопировал и вставил содержимое функций display() в мой метод -(void)drawRect.Когда я запускаю программу, я не получаю ни ошибок, ни предупреждений, ни ошибок времени выполнения, но я получаю только черный экран без треугольника.Но есть белый экран, как и glClear(GL_COLOR_BUFFER_BIT).

1 Ответ

3 голосов
/ 11 июня 2011

Давайте начнем с основ:

float data[][2] = {{50,50},{100,50},{75,100}};

Это массив из 3 пар чисел с плавающей точкой.Таким образом, каждая позиция вершины содержит 2 числа с плавающей точкой.С 3 вершинами, это всего 6 поплавков.

glVertexPointer(3, GL_FLOAT, 3*sizeof(float), 0);

Вы говорите OpenGL, что вы даете ему 3 поплавка на вершину (первые 3).Вы поместили 6 поплавков в буферный объект.Поскольку вы визуализируете один треугольник, вам нужно 3 вершины, что означает, что OpenGL будет пытаться прочитать девять с плавающей точкой.

Действительно, вы, кажется, как-то скопировали это неправильно, как оригиналодин из них верен для данных:

glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);

Теперь это может быть не единственной ошибкой в ​​вашем коде, так как вы не опубликовали процедуры инициализации, которые использовались в ответе, с которым вы связались.Учитывая, что вы поместили код из функции «init» ответа в функцию «dirtyRect», я предполагаю, что у вас есть большие проблемы.

Есть причина, по которой в ответе были отдельные индикации «init» и «display»».Потому что некоторые вещи - это инициализация (создание объекта буфера и установка различных состояний), в то время как другие вещи - это то, что вы делаете каждый раз (очистка буфера, установка указателя и glDrawArrays).

Вы должны найтиспособ сохранить это отделение инициализации от обновления в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...