Opengl es 子类化CCNode,使用glTexImage2D闪击图像

Opengl es 子类化CCNode,使用glTexImage2D闪击图像,opengl-es,cocos2d-iphone,Opengl Es,Cocos2d Iphone,我已经对CCNode进行了子类化,并希望在每次draw调用时闪击一个存储在成员GLubyte*缓冲区中的图像。这将导致绘制一个黑色正方形,同级CCLabel节点现在也完全为黑色 因此有两个问题: 为什么正方形不是白色的?我正在将缓冲区设置为0xFFFFFF draw方法中的OpenGL调用一定有问题,因为它会影响另一个节点的绘制。谁能说什么 数据初始化: exponent = e; width = 1 << exponent; height = 1 << exponent

我已经对CCNode进行了子类化,并希望在每次draw调用时闪击一个存储在成员GLubyte*缓冲区中的图像。这将导致绘制一个黑色正方形,同级CCLabel节点现在也完全为黑色

因此有两个问题:

  • 为什么正方形不是白色的?我正在将缓冲区设置为0xFFFFFF
  • draw方法中的OpenGL调用一定有问题,因为它会影响另一个节点的绘制。谁能说什么
  • 数据初始化:

    exponent = e;
    width = 1 << exponent;
    height = 1 << exponent;
    imageData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
    memset(imageData, 0xff, 4 * width * height * sizeof(GLubyte));
    

    在用数据填充纹理对象之前,需要生成纹理对象。也就是说,在初始化过程中,您需要调用:

    int myTexture; // this is class member variable
    
    glGenTextures(1, &myTexture); // generates an empty texture object
    
    glBindTexture(GL_TEXTURE_2D, myTexture); // activate the texture
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    // makes sure there are no mipmaps (you only specify level 0, in case
    // the texture is scaled during rendering, that could result in black square)
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    // this allocates the texture, but specifies no data
    
    稍后,在绘制时(而不是调用glTexImage2D()),需要激活纹理并使用glTexSubImage2D()指定其数据(这不会为纹理分配新存储)

    在不首先绑定纹理的情况下调用glTex(Sub)Image2D将a)导致OpenGL错误,或b)覆盖当前处于活动状态的其他纹理-可能是同级标签节点的纹理


    希望这有帮助:)

    在填充数据之前,您需要生成纹理对象。也就是说,在初始化过程中,您需要调用:

    int myTexture; // this is class member variable
    
    glGenTextures(1, &myTexture); // generates an empty texture object
    
    glBindTexture(GL_TEXTURE_2D, myTexture); // activate the texture
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    // makes sure there are no mipmaps (you only specify level 0, in case
    // the texture is scaled during rendering, that could result in black square)
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    // this allocates the texture, but specifies no data
    
    稍后,在绘制时(而不是调用glTexImage2D()),需要激活纹理并使用glTexSubImage2D()指定其数据(这不会为纹理分配新存储)

    在不首先绑定纹理的情况下调用glTex(Sub)Image2D将a)导致OpenGL错误,或b)覆盖当前处于活动状态的其他纹理-可能是同级标签节点的纹理


    希望这有帮助:)

    我已经通过使用glDisableClientState/glEnableClientState(GL\u color\u数组)解决了块颜色问题;在绘图中围绕代码展开。这是有意义的,因为默认情况下,每个绘图调用都会启用[GL_纹理\ 2D GL_顶点\数组GL_颜色\数组GL_纹理\协调\数组],而我不需要GL_颜色\数组。但是,siblin CCLabel节点仍然以黑色呈现。通常,当绘制一个对象影响以后绘制的对象时,这是因为您没有重置更改的某些状态。我在上面的代码中没有看到任何明显的东西,所以它可能在代码的其他地方。你是怎么画标签的?还有一个有趣的事实——单词是“闪电战”而不是“闪电战”。它是的缩写。我使用glDisableClientState/glEnableClientState(GL\u color\u数组)解决了块颜色问题;在绘图中围绕代码展开。这是有意义的,因为默认情况下,每个绘图调用都会启用[GL_纹理\ 2D GL_顶点\数组GL_颜色\数组GL_纹理\协调\数组],而我不需要GL_颜色\数组。但是,siblin CCLabel节点仍然以黑色呈现。通常,当绘制一个对象影响以后绘制的对象时,这是因为您没有重置更改的某些状态。我在上面的代码中没有看到任何明显的东西,所以它可能在代码的其他地方。你是怎么画标签的?还有一个有趣的事实——单词是“闪电战”而不是“闪电战”。它是的缩写。
    glBindTexture(GL_TEXTURE_2D, myTexture); // activate the texture
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
    // this specifies texture data without allocating new storage