在我的应用程序中,我需要将两个纹理相乘,然后将结果乘以大于 2 的因子。我为此使用 GL_MODULATE 和 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 MODE 的值为 COMBINE,则纹理函数的形式取决于 COMBINE RGB 和 COMBINE ALPHA 的值,根据表 3.17。然后将纹理函数的 RGB 和 ALPHA 结果乘以RGB SCALE 和 ALPHA SCALE 的值。结果被限制在 [0, 1]。
但我注意到的是不同的。它首先将纹理单元 1 乘以 4 并夹在 [0 1] 中,然后用纹理单元 0 进行调制。但我希望在调制后应用 RGB_SCALE。
我尝试将调制结果写入 FBO,然后使用缩放,但它不起作用。
我想要做的是将一个图像与另一个图像相乘,然后将结果乘以一个高于 2 的值。在第二次乘法之前不应该有钳位。有人能帮帮我吗?