Проблемы с совместным использованием текстур с OpenGL / Cocoa - PullRequest
0 голосов
/ 13 сентября 2010

Я немного новичок в openGL и пытаюсь заставить совместное использование текстур работать между двумя представлениями openGL. Я создал два класса представления NSOpenGL, а затем в конструкторе интерфейса создал окно, в котором было по одному на каждое представление openGL. Первое представление имеет код в своем prepareOpenGl, который устанавливает текстуру и присваивает ее глобальной переменной, второе представление повторно инициализирует свой openGlContext, чтобы оно было разделено с исходным представлением, создавшим текстуру, затем в prepareOpenGL Второе представление я называю glBindTexture для глобальной текстуры. Когда я запускаю свое приложение, я вижу текстуру только в первом виде, а во втором - просто нетекстурированный объект. Кажется, у меня не работает совместное использование текстур. Мне интересно, если моя общая стратегия ошибочна или я просто упускаю небольшую деталь. Я включил то, что кажется наиболее важными фрагментами кода.

-(void)prepareOpenGL {
    //prepareOPenGL of the first view
    glEnable( GL_TEXTURE_2D );
    glEnable(GL_DEPTH_TEST);
    //makeImage() creates a silly little texture pattern
    makeImage();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, &texName);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glShadeModel(GL_SMOOTH);
}
-(void)prepareOpenGL {
    //prepareOpenGL of the second view
    glEnable( GL_TEXTURE_2D );
    glEnable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D, &texName);
    glShadeModel(GL_SMOOTH);
}
- (id)initWithFrame:(NSRect)frame { 
    if(self = [super initWithFrame:frame])
   {
            printf("InitWithFrame: \n");
            NSOpenGLContext* context = [[[NSOpenGLContext alloc] initWithFormat:[NSOpenGLView defaultPixelFormat] shareContext:[otherView openGLContext]] autorelease];
           [self setOpenGLContext:context];
    }
    return self;
}

Когда я ссылаюсь на «второй вид», я имею в виду тот, который пытается использовать текстуру исходного вида.

1 Ответ

0 голосов
/ 13 сентября 2010

Не отправляйте init сообщения объекту, который вы не получили от alloc.

То, что вы делаете там, получает контекст, который уже был инициализирован , а затем повторно инициализирует его . Это плохо: большинство, вероятно, все классы не ожидают повторной инициализации, поэтому это может вызвать утечку памяти.

Что вам нужно сделать, так это создать контекст самостоятельно, используя alloc, initWithFormat:shareContext: и autorelease, а установить его в качестве контекста .

У меня нет возможности узнать, решит ли это полностью вашу проблему, но это поможет, и, по крайней мере, устранит некоторые возможные утечки памяти, которые есть у вас в текущем коде.

Вы также неправильно делаете свою реализацию initWithFrame:. См. этот пост и мой комментарий к нему.

В целом, я думаю, вам необходимо перечитать документы Objective-C и Руководство по основам какао . В частности, документ Objective-C охватывает методы init в одной из его глав.

...