2012-07-14 38 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

如果你想要一個例子有很多這方面的例子