qt opengl 混合實現半透明

2021-09-03 07:13:48 字數 2169 閱讀 6976

在二維繪圖裡面的半透明很簡單,把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...