GLenum作为Objective-C OpenGL中的属性

时间:2012-02-16 01:02:32

标签: iphone ios opengl-es textures

我在iOS上遇到OpenGLES问题。为了渲染纹理,我通过

加载它
if (numberOfMipmaps > 0) {
    if (textureData != 0)
        glDeleteTextures(1, &textureData);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures(1, &textureData);
    glBindTexture(GL_TEXTURE_2D, textureData);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    CHECK_GL_ERROR();

    for (GLint i = 0; i < numberOfMipmaps; i++) {
        unsigned char *data = mipmaps[i].address;

        glTexImage2D(GL_TEXTURE_2D, i, internalFormat, width, height, 0, format, target, data);
        //glGenerateMipmapOES(GL_TEXTURE_2D);
        CHECK_GL_ERROR();

        width = MAX(width >> 1, 1);
        height = MAX(height >> 1, 1);
    }
}

internalFormat,format和target是我声明的同义属性:

@property (nonatomic, assign) GLint internalFormat;
@property (nonatomic, assign) GLenum format;
@property (nonatomic, assign) GLenum target;

问题是它不能以这种方式工作。我没有编译或运行时错误。我只看到一个白色屏幕,这是一个指示,没有数据加载到纹理内存中。我在构造函数

中设置了这三个变量
internalFormat = GL_RGBA;
format = GL_RGBA;
target = GL_UNSIGNED_SHORT_5_5_5_1;

这背后的想法是从我的类继承提供其他纹理格式,如RGB565。 它曾经工作,如果我只是重载我创建GL纹理和硬编码glTexImage2D函数的方法

glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_565, data);

任何人都可以向我解释为什么当我使用属性时它不起作用。

编辑: 只是要清楚:问题是为什么我不能在glTexImage2D函数中使用属性作为参数?

编辑2: 我想我得到了问题。 GL_RGBA和GL_UNSIGNED ...在opengles头文件中定义,因此ObjC预编译器将十六进制代码粘贴到glTexImage2D函数调用中。如果我使用变量,预编译器不会更改任何内容,并且值会在运行时插入,但这不起作用。

1 个答案:

答案 0 :(得分:0)

GLenum类型只是iOS上的一个典型unsigned int。你应该可以像使用任何其他unsigned int一样使用它们作为“assign”属性类型,这看起来就像你正在做的那样,所以你的实际赋值/使用属性有问题。


顺便说一下,您直接在实际代码中访问那些合成的ivars。如果您正在使用属性,则应该使用例如self.format[self format]为了清楚起见,即使这里可能没有必要。