2013-04-04 74 views
0

在我的应用程序中,我需要乘以两个纹理,然后乘以高于2的因子。我正在使用GL_MODULATE和GL_RGB_SCALE。我用下面的代码本OpenGL ES 1.1调制和GL_RGB_SCALE

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, Input.texID); 
glEnable(GL_TEXTURE_2D); 


glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, Temp64.texID); 
glEnable(GL_TEXTURE_2D); 
// glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Temp64.wide, Temp64.high, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS); 

glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 4.0); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO); 
glViewport(0, 0, wide, high); 
//glClear(GL_COLOR_BUFFER_BIT); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

根据我的纹理之间OpenGL ES的1.1规范第一调制的理解完成,然后乘以4被完成,然后夹紧到[0 1]。

这是规范说什么

“如果TEXTURE ENV模式的值是联合收割机,FUNC-重刑取决于COMBINE RGB并结合ALPHA值纹理的形式,根据表3.17。该然后纹理函数的RGB和ALPHA结果分别被RGB SCALE和ALPHA SCALE的值叠加,结果被钳位为[0,1]。

但我注意到的是不同的。它首先将纹理单元1乘以4,并将其固定为[0 1],然后用纹理单元0进行调制。但是我希望在调制之后应用RGB_SCALE。

我试图将调制结果写入FBO,然后使用缩放,但它不起作用。

我想要做的是将图像与另一图像相乘,然后将结果乘以高于2的值。在第二次乘法之前不应夹紧。有人能帮帮我吗?

回答

0

在过去,我有几个与纹理合成器相关的问题与您提到的类似。现代硬件没有固定的功能流水线,所以它的所有功能都是通过着色器实现的,其中一些实现有意想不到的结果。

什么是您的目标平台?我的建议是摆脱纹理组合器,并将所有代码移动到着色器(如果您的目标平台允许)。

而且,如果我正确地读你的代码,你需要把glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE)结合的第一个纹理之后,所以你可以使用它,当你调用glTexEnvi(GL_TEXTURE_ENV,GL_SRC1_RGB,GL_PREVIOUS)。

glEnable(GL_TEXTURE_2D)也放错了位置,它应该在任何其他纹理相关函数之前调用。