我正在尝试使用 RenderMonkey 来设计一个使用 Alpha 透明度的 GLSL 着色器,并且 RenderState 编辑器不使用我在 OpenGL 中使用的相同术语。谁能建议如何配置它以实现简单的 Alpha 透明度?
所有几何体都存储在一个VBO中(透明+不透明).我不能排序几何.如何在不丢失数据颜色的情况下禁止从glsl写入深度缓冲区?
我正在尝试使用windows alphablend API调用将两个画布混合在一起.首先,我在主画布(目标)上绘制一些东西,然后使用TBitmap实例化另一个画布,绘制到那个,然后将两者混合在一起(按照SO上的答案).
但是,我发现它总是返回false,起初我认为它与传递源和目标的错误句柄有关,但我无法弄明白.会是什么呢?
unit MainWnd;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ControlsEx;
type
{------------------------------------------------------------------------------}
TfrmMain = class(TForm)
PaintBox1: TPaintBox;
procedure PaintBox1Paint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{..............................................................................}
procedure alphaBlendf(
const in_target : TCanvas;
const in_transperancy : integer;
const in_color : TColor;
const in_rect : TRect;
const in_width : integer;
const in_height : integer);
var
w : integer;
h : integer; …Run Code Online (Sandbox Code Playgroud) 我需要对 2 张大小不同的图像进行 alpha 混合。我已经设法通过将它们调整为相同的大小来合成它们,所以我得到了部分逻辑:
import cv2 as cv
def combine_two_color_images_composited(foreground_image, background_image):
foreground = cv.resize(foreground_image, (400,400), interpolation=cv.INTER_CUBIC).copy()
background = cv.resize(background_image, (400,400), interpolation=cv.INTER_CUBIC).copy()
alpha =0.5
# do composite of foreground onto the background
cv.addWeighted(foreground, alpha, background, 1 - alpha, 0, background)
cv.imshow('composited image', background)
cv.waitKey(10000)
Run Code Online (Sandbox Code Playgroud)
我想知道是否需要制作一个与较大图像大小相同的蒙版,然后将其用于我的第一张图像。如果是这样,我还不知道如何在 CV2 中进行掩蔽……这只是我项目的一小部分,因此我无法花费大量时间研究掩蔽的工作原理。
我已经搜索了所有内容,但我找到的代码执行诸如将图像“添加”在一起(并排)之类的操作。
遵循这个混合两个颜色值的 alpha 公式,我希望将其应用于rgba 图像数据的n 个numpy 数组(尽管预期的用例在实践中将具有非常低的数组上限,可能 > 5)。在上下文中,这个过程将被限制为相同形状的数组。
理论上我可以通过迭代来实现这一点,但预计这将是计算密集型且效率极低的。
在整个数组的两个数组之间相同位置的两个元素之间应用函数的最有效方法是什么?
一个松散的例子:
# in context, the numpy arrays come from here, as either numpy data in the
# first place or a path
def import_data(source):
# first test for an extant numpy array
try:
assert(type(source) is np.ndarray)
data = source
except AssertionError:
try:
exists(source)
data = add_alpha_channel(np.array(Image.open(source)))
except IOError:
raise IOError("Cannot identify image data in file '{0}'".format(source))
except TypeError:
raise TypeError("Cannot identify image data from source.") …Run Code Online (Sandbox Code Playgroud) 这可能是一个noob问题,但是,我还没有找到合适的答案:
我在OpenGL ES中有一个对象(实际上是Blender的UV映射导出),我想对它应用两个纹理.确切地说,我有一个像地球一样的球体,我想在它上面添加两种纹理(白天和夜晚).
我曾想过通过alpha映射,应该可以在运行时以编程方式淡化一个纹理并显示另一个纹理,这样我的地球就可以成为地球的真实模拟.我有它背后的数学,即为对象的每个面创建alpha映射不是问题.
任何提示/指示如何实现这一目标?
谢谢
几十年来我一直设法避免使用 Windows GDI,现在我付出了代价。以下 C++ 代码不会产生正确的颜色。它只是应该对窗口进行白色填充,然后对单个位图进行 alpha 混合。所有 alpha 都是位图中每个像素的 alpha。
// Create a memory DC
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmMem = CreateCompatibleBitmap(hdc, cxWnd, cyWnd);
SelectObject(hdcMem, hbmMem);
// White-fill the BG
FillRect(hdcMem, &rectWnd, static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)));
// Alpha blend the bitmap into the memory DC
HDC hdcSrc = CreateCompatibleDC(hdcMem);
HBITMAP hbmOld = static_cast<HBITMAP>(SelectObject(hdcSrc, hbm));
BLENDFUNCTION bfn = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(hdcMem, x, y, cxBmp, cyBmp, hdcSrc, 0, 0, cxBmp, cyBmp, bfn);
SelectObject(hdcSrc, hbmOld);
DeleteDC(hdcSrc);
// Blit the memory DC …Run Code Online (Sandbox Code Playgroud) 代码:
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.LESS);
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
问题在于在图形上绘制了“多余”:
如何纠正?
PSα=0.9
我想,如图所示混合两个图像这里.
这是我的整个代码
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace cv;
int main( int argc, char** argv )
{
double beta; double input;
Mat src1, src2, dst;
/// Ask the user enter alpha
std::cout<<" Simple Linear Blender "<<std::endl;
std::cout<<"-----------------------"<<std::endl;
src1 = imread("face.jpg");
src2 = imread("necklace1.png");
if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
if( !src2.data ) { printf("Error loading src2 \n"); return -1; }
double alpha = 0.1; // something
int min_x = ( (src1.cols …Run Code Online (Sandbox Code Playgroud)