在二維繪圖裡面的半透明很簡單,把alpha通道的值不設定為1或者255就能看見後面的物體;後面物體的清晰度根據設定值的大小來決定。而在opengl中要實現半透明效果也很簡單,但相比二維繪圖還是要麻煩一些了。
其方法為啟用gl_blend混合功能,設定混合因子;這樣opengl就會用混合因子將前、後兩個物體顏色進行混合;這裡有很多種混合方式,可以只顯示前面物體,也可以只顯示後面物體,也可以畫素疊加(分為rgb疊加,alpha疊加)等待。
我實現的效果如下
這裡我只介紹綠色的混合實現,其渲染器很簡單就是乙個普通的紋理2d
#ifndef imagerender_h
#define imagerender_h
#include #include #include #include class imagerender
; qopenglbuffer vbo_;
};#endif // imagerender_h
#include "imagerender.h"
imagerender::~imagerender()
void imagerender::initsize(qstring filename)
; vbo_.create();
vbo_.bind();
vbo_.allocate(points, sizeof points);
}void imagerender::render(qopenglextrafunctions *f, qmatrix4x4 &pmatrix, qmatrix4x4 &vmatrix, qmatrix4x4 &mmatrix)
其shader如下
#version 330
uniform mat4 upmatrix,uvmatrix,ummatrix;
layout (location = 0) in vec3 aposition;
layout (location = 1) in vec2 atexture;
smooth out vec2 vtexturecood;
void main(void)
#version 330
uniform sampler2d stexture;
in vec2 vtexturecood;
out vec4 fragcolor;
void main(void)
其它的還用到了mipmap紋理渲染器,和乙個obj模型渲染器,在前面有就不介紹了。在使用時根據需要開啟混合功能。
mmatrix.settoidentity();
mmatrix.translate(3,1,10);
imagerender_.render(f,pmatrix,vmatrix,mmatrix); //不啟用混合
f->glenable(gl_blend); //啟用混合
mmatrix.settoidentity();
mmatrix.translate(-1.2,1.6,10);
mmatrix.scale(1.2);
f->glblendfunc(gl_src_color,gl_one_minus_src_color); //用前物體因子用rgba、後物體因子為前物體rgba的1-前物體的rgba值(opengl中顏色值為0-1)。實現的效果類似於透過有色玻璃看物體
imagerender_.render(f,pmatrix,vmatrix,mmatrix);
mmatrix.settoidentity();
mmatrix.translate(1.0,2.6,10);
f->glblendfunc(gl_src_alpha,gl_one_minus_src_alpha); //以前物體的透明度為基準,前物體全透明,就只能看見後面的物體;前物體半透明,就能看見後面物體。
imagerender1_.render(f,pmatrix,vmatrix,mmatrix);
f->gldisable(gl_blend);//關閉混合
Unity Shader 實現半透明效果
想要實現如下效果 主角可以遮擋背景,背景遮擋主角時候半透明混合 研究了一周,shader知識了解從無到稍稍入門,終於解決了,記錄一下實現方案。使用blend one oneminussrcalpha指令,也就是srccolor dstcolor 1 srcalpha 假設a和b重疊,先渲染a,然後渲...
半透明視窗的實現
在上篇 關於視窗嵌入桌面及透明的注意事項 提到 setlayeredwindowattributes 會使視窗上的控制項也一起被透明化 網上搜了一下,也沒有比較好的解決辦法 似乎唯一的解決辦法就是 在視窗後面再貼個透明視窗。步驟 1.使用 setwindowrgn 將沒有控制項的區域鏤空 2.建立乙...
半透明 MFC實現父視窗不透明,子視窗半透明效果
cpp view plain copy onerasebkgnd cdc pdc 描述 根據msdn所述,子視窗的半透屬性是跟隨父視窗的。也就是說在子視窗中用setlayeredwindowattributes方法完成透明是不可行的。如果子視窗設定成overlap或者popup格式,雖然可用setl...