我在做什么这是不必要的? (iPhone,OpenGL ES)

时间:2009-06-13 06:53:23

标签: iphone opengl-es

我正在使用OpenGL ES在iPhone游戏中绘制内容。有时我喜欢更改我正在绘制的纹理的alpha 。这是我使用的(工作)代码。这个代码示例中有什么(如果有的话)是不必要的?谢谢!

    // draw texture with alpha "myAlpha"
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE );
    glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB,GL_MODULATE);
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB,GL_PRIMARY_COLOR);
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB,GL_SRC_COLOR);
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB,GL_TEXTURE);
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB,GL_SRC_COLOR);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_BLEND);
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(myAlpha, myAlpha, myAlpha, myAlpha);

    glPushMatrix();
    glTranslatef(xLoc, yLoc, 0);
    [MyTexture drawAtPoint:CGPointZero];
    glPopMatrix();

    glColor4f(1.0, 1.0, 1.0, 1.0);

编辑:

以上代码示例用于绘制带有修改后的alpha值(因此我可以淡入淡出)。当我只想绘制w / o修改alpha值时,我会使用上面示例的最后5行,而不是最后一次调用glColor4f。

3 个答案:

答案 0 :(得分:2)

我不是专家,但我正在阅读Optimizing OpenGL ES for iPhone OS并且它有一个关于“优化纹理”的部分可能会帮助你。

答案 1 :(得分:2)

您有调用配置纹理环境和帧缓冲混合,这是完全不同的功能。您在绘制之前也会调用glTexEnvf(GL_TEXTURE_ENV,GL_OPERAND1_RGB,x)两次,因此只有第二次调用很重要。

如果您真正想要的是将原色乘以纹理颜色,那么它就像glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)一样简单。其他对glTexEnv的调用是不必要的。

答案 2 :(得分:2)

我的绘图如下:

glBindTexture(GL_TEXTURE_2D, tex->name); // bind to the name
glVertexPointer(3, GL_FLOAT, 0, vertices); // verices is the alignment in triangles
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); // coordinates describes the rectangle
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //draw

如果不确切知道你想要做什么,很难知道你可以删除什么。

修改

除非你在某些时候禁用混合,否则你可以摆脱所有混合调用:

glEnable(GL_BLEND);
glBlendFunc...

如果需要设置一次,请将它们置于GL状态的初始化状态。如果你需要启用和禁用它最好为你需要绘制混合的一切设置状态,然后再次设置状态(一次)为未混合。

OpenGL是state machine所以这个一般的想法适用于你需要改变GL状态的任何地方(比如用glTexEnvf设置纹理环境)。

关于州机器:

  

当前状态由过去确定   系统的状态。因此,它可以   据说记录有关的信息   过去,即它反映了输入   从系统的变化开始到   现在的时刻。过渡表明   状态变化并由a描述   需要的条件   实现了过渡。