Thanks for the tip I've allready implemented arrays.
I did it like this:

Pixel/shader creator example (woks perfect):
(t3arr is just a record containing r,g,b bytes)

[pascal]
const
TEXWIDTH=256;
TEXHEIGHT=256;

type
TextureItem=record
Data: Pointer;
Texture: gluInt;
Raw: array[0..255,0..255] of T3Arr;
end;

function GetPixelShape(X,Y: byte):byte;
var
x2,y2,radius,baseradius,temp: extended;
begin
x2:=128;
y2:=128;
radius:=Sqrt(power((x2-x),2)+power((y2-y),2));
baseradius:=Sqrt(power((x2-30),2)+power((y2-12,2));
if radius<=baseradius then
Result:=255-trunc(2.5*radius)
else
Result:=0;
end;

procedure Pixel(LayerNumber: integer; Grid: byte);
var
pData: pRGBTriple;
j, i: integer;
temp: integer;
F: boolean;
begin
if Grid=1 then
F:=true
else
F:=false;
GetMem(pData, TEXHEIGHT * TEXWIDTH * SizeOf(TRGBTriple));
FTextures[LayerNumber].Data:= pData;
for j := 0 to TEXHEIGHT - 1 do
for I := 0 to TEXWIDTH - 1 do
begin
Temp:=GetPixelShape(I,J);
if f=false then //don't draw with grid
begin
case FCurrentOperator of
0: //Overwrite
begin
FTextures[LayerNumber].Raw[J,I].r:=temp;
FTextures[LayerNumber].Raw[J,I].g:=temp;
FTextures[LayerNumber].Raw[J,I].b:=temp;
end;
1: //Add
begin
if temp<>0 then
begin
FTextures[LayerNumber].Raw[J,I].r:=trunc((FTextures[LayerNumber].Raw[J,I].r /2)+(temp/2));
FTextures[LayerNumber].Raw[J,I].g:=trunc((FTextures[LayerNumber].Raw[J,I].g /2)+(temp/2));
FTextures[LayerNumber].Raw[J,I].b:=trunc((FTextures[LayerNumber].Raw[J,I].b /2)+(temp/2));
end;
end;
end;
pData.rgbtRed:= FTextures[LayerNumber].raw[J,I].r;
pData.rgbtGreen:= FTextures[LayerNumber].raw[J,I].g;
pData.rgbtBlue:= FTextures[LayerNumber].raw[J,I].b;
end
else //draw with grid
if (odd(i)) and (odd(j)) then
begin
FTextures[LayerNumber].Raw[J,I].r:=0;
FTextures[LayerNumber].Raw[J,I].g:=0;
FTextures[LayerNumber].Raw[J,I].b:=0;
pData.rgbtRed:= 0;
pData.rgbtGreen:= 0;
pData.rgbtBlue:= 0;
end
else
begin
case FCurrentOperator of
0: //overwrite
begin
FTextures[LayerNumber].Raw[J,I].r:=temp;
FTextures[LayerNumber].Raw[J,I].g:=temp;
FTextures[LayerNumber].Raw[J,I].b:=temp;
end;
1: //add
begin
if temp<>0 then
begin
FTextures[LayerNumber].Raw[J,I].r:=trunc((FTextures[LayerNumber].Raw[J,I].r /2)+(temp/2));
FTextures[LayerNumber].Raw[J,I].g:=trunc((FTextures[LayerNumber].Raw[J,I].g /2)+(temp/2));
FTextures[LayerNumber].Raw[J,I].b:=trunc((FTextures[LayerNumber].Raw[J,I].b /2)+(temp/2));
end;
end;
end;
pData.rgbtRed:=FTextures[LayerNumber].Raw[J,I].r;
pData.rgbtGreen:=FTextures[LayerNumber].Raw[J,I].g;
pData.rgbtBlue:=FTextures[LayerNumber].Raw[J,I].b;
end;
inc(pData, 1);
end;
end;

[/pascal]

However, I've had some problems getting my blending procedure right, which was the reason for my question:

[pascal]
procedure CombineTextures(src1,src2,dest: integer);
var
pData: pRGBTriple;
j, i: integer;
temp: byte;
begin
GetMem(pData, TEXHEIGHT * TEXWIDTH * SizeOf(TRGBTriple));
FTextures[dest].Data:= pData;
for j := 0 to TEXHEIGHT - 1 do
for I := 0 to TEXWIDTH - 1 do
begin
FTextures[Dest].raw[J,I].r:=trunc((FTextures[src1].Raw[J,I].r/2)+((FTextures[Src2].Raw[J,I].r / 2)));
FTextures[Dest].raw[J,I].g:=trunc((FTextures[src1].Raw[J,I].g/2)+((FTextures[Src2].Raw[J,I].g / 2)));
FTextures[Dest].raw[J,I].b:=trunc((FTextures[src1].Raw[J,I].b/2)+((FTextures[Src2].Raw[J,I].b / 2)));

pData.rgbtRed:=FTextures[Dest].raw[J,I].r;
pData.rgbtGreen:=FTextures[Dest].raw[J,I].g;
pData.rgbtBlue:=FTextures[Dest].raw[J,I].b;
inc(pData, 1);
end;
end;
[/pascal]