2012-07-14 37 views
2

我正在使用OpenGL(固定管道,我需要支持GL1.1)将图像变成棕褐色的颜色。使用OpenGL固定管线(例如多纹理)转动图像棕褐色

到目前为止,我已经能够(有点,它结束了太黑暗)灰度图像,但是当我尝试调整或添加另一种颜色给它以棕褐色外观时,所有出现的是一个常量颜色。

到目前为止代码

float weights_vector[] = { 0.2126f, 0.7152f, 0.0722f, 1.0f }; 
float color_vector[] = {0.1f, 0.2f, 0.05f, 0.0f}; 

gl.glActiveTexture(GL11.GL_TEXTURE0); // Select texture unit 0 
gl.glBindTexture(GL11.GL_TEXTURE_2D, _texturePointer); // Bind the texture 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); // Set to combine 
if (grayscale) { // Gives better results, but can't understand yet why 
    gl.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 
} 
else { 
    gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); 
} 

/* Grayscale */ 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_DOT3_RGB); 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_TEXTURE); 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_ONE_MINUS_SRC_COLOR); 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_CONSTANT); 
gl.glTexEnvfv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, weights_vector, 0); 

/* Give color */ 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_ADD); 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_PREVIOUS); 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_CONSTANT); 
gl.glTexEnvfv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, color_vector, 0); 

编辑1:

我终于得到了它的工作多亏@Tim,谁断然指出我的代码永远不会成功。我在这里留下工作代码以防万一需要它。

最终的代码看起来像这样,并且像魅力一样工作,虽然在我的移动设备上有点慢,屏幕上有很多精灵。

gl.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 

// STAGE 0 
gl.glActiveTexture(GL11.GL_TEXTURE0); 
gl.glEnable(GL11.GL_TEXTURE_2D); 
gl.glBindTexture(GL11.GL_TEXTURE_2D, _texturePointer); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_DOT3_RGB); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_TEXTURE); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_CONSTANT); 
//gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); 
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_ONE_MINUS_SRC_COLOR); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); 
gl.glTexEnvfv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, weights_vector, 0); 

// STAGE 2 
gl.glActiveTexture(GL11.GL_TEXTURE1); 
gl.glEnable(GL11.GL_TEXTURE_2D); 
gl.glBindTexture(GL11.GL_TEXTURE_2D, 100); // Dummy texture - use any that's not your current 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_ADD); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_PREVIOUS); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_CONSTANT); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); 
gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); 

回答

3

我认为你对状态机的工作原理有一个误解。

如果您希望该代码将颜色转换为灰度,然后将灰度转换为棕褐色,则不会如此。

Give color下的代码没有被追加到Grayscale阶段末尾,它只是覆盖了它的所有设置。所以你直接从纹理示例到GL_ADD部分,因为你已经覆盖了所有的灰度设置。您需要切换到另一个纹理单元以将灰度级设置为棕褐色变换。

http://www.opengl.org/wiki/Texture_Combiners

如果你想要一个例子有很多这方面的例子