Objective-C: как выделить массив GLuint - PullRequest
1 голос
/ 09 июня 2010

У меня есть массив GLuint с фиксированным размером:

GLuint textures[10];

Теперь мне нужно установить размер массива динамически.Я написал что-то вроде этого:

*. Ч:

GLuint *textures; 

*. М:

textures = malloc(N * sizeof(GLuint)); 

где N - нужный размер.Затем он использовал так:

glGenTextures(N, &textures[0]);
// load texture from image

-(GLuint)getTexture:(int)index{
    return textures[index];
}

Я использовал ответ из здесь , но программа упала во время выполнения.Как это исправить?

Программа написана на Objective-C и использует OpenGL ES.

Ответы [ 3 ]

1 голос
/ 10 июня 2010

Я понял эту проблему.

Этот код действителен, но, похоже, не работает.Эта проблема описана здесь , но она не так очевидна.

Решение, которое работает для меня, заключается в создании отдельного класса со свойством GLuint:

@interface Texture : NSObject
    GLuint texture;
@end

@property (nonatomic, readwrite) GLuint texture;

Затем мы можем создать NSMutableArray of Textures:

NSMutableArray *textures;

In *.В файле m мы должны заполнить наш массив:

for(int i=0;i<N;i++){
    Texture *t = [[Texture alloc] init];
    t.texture = i;
    GLuint l = t.texture;
    [textures addObject:t];
    glGenTextures(1, &l);
}

Если вы используете другие массивы с текстурами, вам нужно сместить индексы GLuint, например:

t.texture = i+M;

где M - размерранее использовавшийся массив GLuint.

Тогда getTexture будет переписан следующим образом:

-(GLuint)getTexture:(int)index{
    return textures[index].texture;
}

Я не в восторге от этого подхода, но я работаю над одним.

0 голосов
/ 09 июня 2010

void glGenTextures (GLsizei n, GLuint * textures);

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

может просто попробовать

glGenTextures (N, textures);

0 голосов
/ 09 июня 2010

Если установить значение N равным 10, то поведение двух методов будет одинаковым. Поэтому вам следует искать причину сбоя в разных местах.

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