我正在使用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。
答案 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描述 需要的条件 实现了过渡。