我試圖混合從FBO獲得並在四邊形上繪製它們的兩種不同紋理(場景和雲)。LibGDX - 使用着色器在另一個紋理之上疊加紋理
uniform sampler2D u_texture;
uniform sampler2D u_texture2;
uniform vec2 u_res;
void main(void)
{
vec2 texCoord = gl_FragCoord.xy/u_res.xy;
vec4 sceneColor = texture2D(u_texture, texCoord);
vec4 addColor = texture2D(u_texture2, texCoord);
gl_FragColor = sceneColor+addColor;
}
glBlendFunc是
Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
我試過的所有glBlendFunc
組合及以上爲最佳組合。
創建的FBO:
fbClouds = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
fbScene = new FrameBuffer(Format.RGB565, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
fbMix = new FrameBuffer(Format.RGB565, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
創建雲:
fbClouds.begin();
Gdx.gl.glClearColor(0, 0, 0, 0); // to make it transparent
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
modelBatch.begin(cam);
for (Integer e : drawOrder) {
if(isVisible(cam, clouds[e])){
drawLightning(e, modelBatch);
modelBatch.render(clouds[e], cloudShader);
modelBatch.flush();
}
}
modelBatch.end();
fbClouds.end();
渲染代碼:
Gdx.gl20.glDisable(GL20.GL_BLEND);
//Gdx.gl20.glEnable(GL20.GL_BLEND);
//Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
fbMix.begin();
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
mixShader.begin();
fbScene.getColorBufferTexture().bind(1);
mixShader.setUniformi("u_texture", 1);
fbClouds.getColorBufferTexture().bind(0);
mixShader.setUniformi("u_texture2", 0);
mixShader.setUniformf("u_res", Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
quad.render(mixShader, GL20.GL_TRIANGLES);
mixShader.end();
fbMix.end();
所以,我得到意想不到的結果(雲有絕對的白色,但他們應該灰色):
在情況下,如果我用modelbatch
渲染雲的結果是應該是:
什麼是不失色彩混合兩種紋理的正確方法?
因爲您將灰色添加到明亮的藍色,所以它變成了亮白色。但我不確定你的描述到底發生了什麼。混合func是你在繪製FBO的時候使用的什麼,或者你用什麼來繪製所有的FBO到屏幕上?在您使用的片段着色器中,您需要使用雲紋理的alpha來乘以雲紋理和(雲紋理的1- alpha)以乘以天空紋理。但是您需要確保您的雲端FBO支持alpha並寫入該alpha通道。有點複雜。也許有一個更簡單的方法? – Tenfour04
@ Tenfour04,我應該使用哪種配方?你可以根據我的着色器源代碼向我展示它嗎?雲可能是紅色或綠色,沒關係。無論如何,它們都變成了白色! – Nolesh
我還不清楚你在做什麼。如果你能澄清,我想我有一個可行的解決方案。您在頂部顯示片段着色器。我認爲你的意思是你把天空和太陽畫給一個FBO,然後把這些雲畫給另一個FBO。假設這是正確的,你如何用ModelInstance繪製雲?你正在畫雲的FBO的顏色是什麼?你提到混合func你提到了什麼你用雲將他們吸入他們的FBO,或者是你用什麼來繪製你的Quad與兩個FBO到主緩衝區? – Tenfour04