From info-volumizer-owner@els.sgi.com Mon Oct  3 08:56:54 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j93Fro2J8187366;
	Mon, 3 Oct 2005 08:53:50 -0700 (PDT)
Received: from mscan1.ucar.edu (mscan1.ucar.edu [192.43.244.120])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j93F9RJT8164118
	for <info-volumizer@els.sgi.com>; Mon, 3 Oct 2005 08:09:29 -0700 (PDT)
Received: from localhost (mscan1 [127.0.0.1])
	by mscan1.ucar.edu (Postfix) with ESMTP id E06CD87E44
	for <info-volumizer@els.sgi.com>; Mon,  3 Oct 2005 09:09:25 -0600 (MDT)
Received: from mscan1.ucar.edu ([127.0.0.1])
 by localhost (mscan1.ucar.edu [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id 21799-10 for <info-volumizer@els.sgi.com>;
 Mon,  3 Oct 2005 09:09:25 -0600 (MDT)
Received: from mail.ucar.edu (mail.ucar.edu [128.117.64.220])
	by mscan1.ucar.edu (Postfix) with ESMTP id C595F87E35
	for <info-volumizer@els.sgi.com>; Mon,  3 Oct 2005 09:09:25 -0600 (MDT)
Received: from [128.117.220.121] (account alan HELO [128.117.220.121])
  by mail.ucar.edu (CommuniGate Pro SMTP 4.2.7)
  with ESMTP id 4605379 for info-volumizer@els.sgi.com; Mon, 03 Oct 2005 09:09:25 -0600
Message-ID: <434149A4.2070504@ucar.edu>
Date: Mon, 03 Oct 2005 09:09:24 -0600
From: Alan Norton <alan@ucar.edu>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040910
X-Accept-Language: en-us, en
MIME-Version: 1.0
To: "info-volumizer@els.sgi.com" <info-volumizer@els.sgi.com>
Subject: [info-volumizer] Volumizer 2.9 regression with Quadro FX 1000
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: amavisd-new at ucar.edu
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

Praveen,
We have found that Volumizer 2.9 consistently seg faults on a Quadro FX 
1000 when we combine volume rendering with changing the color/opacity 
mapping.  This is not a problem with Volumizer 2.8, although we did 
previously find problems with Volumizer 2.7 using this graphics card.   
There are unfortunately no unusual messages (using VOLUMIZER_DEBUG_LEVEL 
5) before the crash.  We are using 32-bit Red Hat Linux.
-Alan

From info-volumizer-owner@els.sgi.com Thu Oct  6 04:13:54 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j96BCWC67755002;
	Thu, 6 Oct 2005 04:12:32 -0700 (PDT)
Received: from hastur.corp.sgi.com (hastur.corp.sgi.com [198.149.32.33])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j96B9tJT8229522
	for <info-volumizer@els.sgi.com>; Thu, 6 Oct 2005 04:09:55 -0700 (PDT)
Received: from mtv-atc-013e--n.corp.sgi.com (mtv-atc-013e--n.corp.sgi.com [192.26.78.50])
	by hastur.corp.sgi.com (8.12.9/8.12.10/SGI_generic_relay-1.2) with ESMTP id j96B9feS200202939
	for <info-volumizer@els.sgi.com>; Thu, 6 Oct 2005 04:09:41 -0700 (PDT)
Received: from praveenlaptop (134.14.90.92 [134.14.90.92]) by mtv-atc-013e--n.corp.sgi.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2655.55)
	id 4D4ZBPT3; Thu, 6 Oct 2005 04:09:52 -0700
From: "Praveen Bhaniramka" <praveenb@sgi.com>
To: <info-volumizer@els.sgi.com>
Subject: RE: [info-volumizer] Volumizer 2.9 regression with Quadro FX 1000
Date: Thu, 6 Oct 2005 16:39:45 +0530
Message-ID: <000001c5ca66$7a4b3030$5c5a0e86@asiapac.sgi.com>
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit
X-Priority: 3 (Normal)
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook, Build 10.0.2627
Importance: Normal
In-Reply-To: <434149A4.2070504@ucar.edu>
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

Hi Alan,

Sorry for the late reply. Is it possible for you to send us a test case
so that we can reproduce this issue at our end? If you cannot share the
source code, the binaries should do as well. Kindly also include details
of the graphics driver version, data size/parameters, etc. 

I will file a bug internally for this issue and we will follow-up with
you offline as and when we need more info or have updated software for
you to check out. 

Thanks.
Praveen

> -----Original Message-----
> From: owner-info-volumizer@els.sgi.com 
> [mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Alan Norton
> Sent: Monday, October 03, 2005 8:39 PM
> To: info-volumizer@els.sgi.com
> Subject: [info-volumizer] Volumizer 2.9 regression with Quadro FX 1000
> 
> 
> Praveen,
> We have found that Volumizer 2.9 consistently seg faults on a 
> Quadro FX 
> 1000 when we combine volume rendering with changing the color/opacity 
> mapping.  This is not a problem with Volumizer 2.8, although we did 
> previously find problems with Volumizer 2.7 using this 
> graphics card.   
> There are unfortunately no unusual messages (using 
> VOLUMIZER_DEBUG_LEVEL 
> 5) before the crash.  We are using 32-bit Red Hat Linux.
> -Alan
> 


From info-volumizer-owner@els.sgi.com Tue Oct 11 21:09:50 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9C48RWJ8335519;
	Tue, 11 Oct 2005 21:08:27 -0700 (PDT)
Received: from smtp.nist.gov (rimp2.nist.gov [129.6.16.227])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9BKvxJT8353987
	for <info-volumizer@els.sgi.com>; Tue, 11 Oct 2005 13:57:59 -0700 (PDT)
Received: from vail.cam.nist.gov (vail.cam.nist.gov [129.6.80.93])
	by smtp.nist.gov (8.13.1/8.13.1) with ESMTP id j9BKvtcb030561;
	Tue, 11 Oct 2005 16:57:56 -0400
Received: from vail.cam.nist.gov (localhost [127.0.0.1])
	by vail.cam.nist.gov (SGI-8.12.5/8.12.5) with ESMTP id j9BKvrAn665784;
	Tue, 11 Oct 2005 16:57:53 -0400 (EDT)
Received: from localhost (steve@localhost)
	by vail.cam.nist.gov (SGI-8.12.5/8.12.5/Submit) with ESMTP id j9BKvrhW664639;
	Tue, 11 Oct 2005 16:57:53 -0400 (EDT)
X-Authentication-Warning: vail.cam.nist.gov: steve owned process doing -bs
Date: Tue, 11 Oct 2005 16:57:53 -0400
From: Steve Satterfield <steve@nist.gov>
X-X-Sender: steve@vail.cam.nist.gov
To: Volumizer Mailing List <info-volumizer@els.sgi.com>
cc: Steve Satterfield <steve@nist.gov>
Subject: [info-volumizer] DIVERSE BOF at VIS 2005
Message-ID: <Pine.SGI.4.58.0510111656500.660703@vail.cam.nist.gov>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-NIST-MailScanner: Found to be clean
X-NIST-MailScanner-From: steve@nist.gov
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com



Birds of a Feather at VIS 2005 -

     DIVERSE - Flexible Open Source Software for Immersive Visualization

     Thursday, October 27, 6:15-7:45PM
     Hilton Minneapolis, Directors Row 4


DIVERSE is a cross-platform, open source, API for developing Virtual
Environment (VE) applications that can run almost anywhere from laptops to
multi-screen immersive environments. It has a highly flexible design which
emphasizes reuse and reconfiguration of tools over recoding.


DIVERSE provides:

    * a common user interface to interactive graphics and/or VE programs.
      Using DIVERSE the same program can be run on a CAVE(TM),
      ImmersaDesk(TM), HMD, desktop and laptop without modification.

    * a common API to VE oriented hardware such as trackers, wands,
      joysticks, and motion bases.

    * a "remote shared memory" facility that allows data from hardware or
      computation to be asynchronously shared between both local and
      remote processes

DIVERSE is being used for scientific visualization, architectural and
interior design walk-throughs, medical education and user interface design
studies and other applications in both immersive and desktop environments.

For information about DIVERSE see the web page- http://diverse.sourceforge.net

For information about the VIS 2005 BOF contact:

   Steve Satterfield: steve@nist.gov
   John Kelso: kelso@nist.gov

-Steve




From info-volumizer-owner@els.sgi.com Tue Oct 18 11:06:32 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9II4qKB8500601;
	Tue, 18 Oct 2005 11:04:52 -0700 (PDT)
Received: from theremin.irus.robarts.ca (theremin.irus.robarts.ca [198.20.40.10])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9IEqEJT8434254
	for <info-volumizer@els.sgi.com>; Tue, 18 Oct 2005 07:52:15 -0700 (PDT)
Received: from crater.irus.robarts.ca (crater.irus.robarts.ca [198.20.36.38])
	by theremin.irus.robarts.ca (8.12.10/8.12.10) with ESMTP id j9IEqD3k027202;
	Tue, 18 Oct 2005 10:52:13 -0400 (EDT)
Date: Tue, 18 Oct 2005 10:52:13 -0400 (EDT)
From: Kevin Wang <kwang@imaging.robarts.ca>
X-X-Sender: kwang@crater.irus.robarts.ca
To: Praveen Bhaniramka <praveenb@sgi.com>
cc: info-volumizer@els.sgi.com
Subject: [info-volumizer] Multiple Transfer functions for volumizer
Message-ID: <Pine.GSO.4.60.0510181035290.8932@crater.irus.robarts.ca>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

Hi Praveen and list,

I would like to use multiple transfer functions for volumizer. From the 
volumizer guide, it shows that one can assign a lookup table for certain 
shaders (LUT, Gradient, etc.)

My question is how to download 2 lookup table to GPU and how to access 
them if I use GPU programming in volumizer.

I see the technique using dependent texture for texture lookup table in 
the guide. I am guessing that this is the way done for the Altix since it 
uses ATI GPU.

Thanks in advance,

-- Kevin

From info-volumizer-owner@els.sgi.com Tue Oct 18 11:50:52 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9IIo8hE8470584;
	Tue, 18 Oct 2005 11:50:08 -0700 (PDT)
Received: from internal-mail-relay.corp.sgi.com (internal-mail-relay.corp.sgi.com [198.149.32.51])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9IIbPJT8474119
	for <info-volumizer@els.sgi.com>; Tue, 18 Oct 2005 11:37:25 -0700 (PDT)
Received: from mtv-atc-013e--n.corp.sgi.com (mtv-atc-013e--n.corp.sgi.com [192.26.78.50])
	by internal-mail-relay.corp.sgi.com (8.12.9/8.12.10/SGI_generic_relay-1.2) with ESMTP id j9IIbP2Z268617111
	for <info-volumizer@els.sgi.com>; Tue, 18 Oct 2005 11:37:25 -0700 (PDT)
Received: from praveenlaptop (134.14.90.92 [134.14.90.92]) by mtv-atc-013e--n.corp.sgi.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2655.55)
	id VAPT89YA; Tue, 18 Oct 2005 11:37:23 -0700
From: "Praveen Bhaniramka" <praveenb@sgi.com>
To: <info-volumizer@els.sgi.com>
Subject: RE: [info-volumizer] Multiple Transfer functions for volumizer
Date: Wed, 19 Oct 2005 00:07:14 +0530
Message-ID: <00bb01c5d412$fb404440$2e17fea9@asiapac.sgi.com>
MIME-Version: 1.0
Content-Type: text/plain;
	charset="US-ASCII"
Content-Transfer-Encoding: 7bit
X-Priority: 3 (Normal)
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook, Build 10.0.2627
In-Reply-To: <Pine.GSO.4.60.0510181035290.8932@crater.irus.robarts.ca>
Importance: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

Hi Kevin,

Using multiple lookup tables with Volumizer is pretty trivial. For this
you need to -

1. Specify the lookup tables in the corresponding shape's appearance
using vzParameterLookupTable objects.
2. Specify the shader (GPU program) that uses the multiple lookup tables
to do what you want them to do.

On modern GPUs, lookup tables can be implemented using dependent texture
lookups. If you are using the ARB_fragment_program extension to write
your shaders (GPU program), you will also need to provide callback
routines to bind these dependent textures on specific texture units.
However, if you are using the ARB_fragment_shader/ARB_shading_language
extensions (also known as the OpenGL Shading Language), the dependent
texture setup is done by Volumizer transparently. You simply need to use
them in your shader. Support for OpenGL Shading Language is available
with Volumizer 2.9 release. 

The CustomShadeViewer example under
/usr/share/Volumizer2/src/apps/simple/tmRenderAction directory
demonstrates the use of multiple lookup tables. There are several
example shaders under /usr/share/Volumizer2/src/shaders to help you get
started with the shader part as well.

Let us know if you have any further questions.

Cheers,
Praveen

> -----Original Message-----
> From: owner-info-volumizer@els.sgi.com 
> [mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Kevin Wang
> Sent: Tuesday, October 18, 2005 8:22 PM
> To: Praveen Bhaniramka
> Cc: info-volumizer@els.sgi.com
> Subject: [info-volumizer] Multiple Transfer functions for volumizer
> 
> 
> Hi Praveen and list,
> 
> I would like to use multiple transfer functions for 
> volumizer. From the 
> volumizer guide, it shows that one can assign a lookup table 
> for certain 
> shaders (LUT, Gradient, etc.)
> 
> My question is how to download 2 lookup table to GPU and how 
> to access 
> them if I use GPU programming in volumizer.
> 
> I see the technique using dependent texture for texture 
> lookup table in 
> the guide. I am guessing that this is the way done for the 
> Altix since it 
> uses ATI GPU.
> 
> Thanks in advance,
> 
> -- Kevin
> 


From info-volumizer-owner@els.sgi.com Wed Oct 19 20:19:01 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9K3HFEE8047440;
	Wed, 19 Oct 2005 20:17:15 -0700 (PDT)
Received: from qproxy.gmail.com (qproxy.gmail.com [72.14.204.201])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9JJpuJT7563524
	for <info-volumizer@els.sgi.com>; Wed, 19 Oct 2005 12:51:56 -0700 (PDT)
Received: by qproxy.gmail.com with SMTP id q18so186859qba
        for <info-volumizer@els.sgi.com>; Wed, 19 Oct 2005 12:51:55 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references;
        b=YpKILGfLD/HCg6yE6gdMfTl1l17hSGtL6WmO+tg2RJ98mBzyuflgnDfyX3e02IFgOe1NBsAJ5zM0WMwFffgMGkVh4mqQBjcxzT1zTKq3LFIJhJkVcpfm2Xm1WgrBEWnv4NVtXteRm9xK1kM+5jGMP6ASpqvosbScRXUpDCLbqd0=
Received: by 10.65.185.2 with SMTP id m2mr824307qbp;
        Wed, 19 Oct 2005 12:51:54 -0700 (PDT)
Received: by 10.65.155.14 with HTTP; Wed, 19 Oct 2005 12:51:54 -0700 (PDT)
Message-ID: <f089541f0510191251qf7820ald2ade26691bcc01c@mail.gmail.com>
Date: Wed, 19 Oct 2005 15:51:54 -0400
From: Kevin Wang <kwang22@gmail.com>
To: info-volumizer@els.sgi.com, praveenb@sgi.com
Subject: Re: [info-volumizer] Multiple Transfer functions for volumizer
In-Reply-To: <00bb01c5d412$fb404440$2e17fea9@asiapac.sgi.com>
MIME-Version: 1.0
Content-Type: multipart/alternative; 
	boundary="----=_Part_9956_8740564.1129751514284"
References: <Pine.GSO.4.60.0510181035290.8932@crater.irus.robarts.ca>
	 <00bb01c5d412$fb404440$2e17fea9@asiapac.sgi.com>
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

------=_Part_9956_8740564.1129751514284
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Praveen,

Thanks for your prompt response. I am experimenting it using
ARB_fragment_shader extension now. For one volume using one LUT it works
with my vtkVolumizerTextureMapper class. But once I add one more volume, it
says "Linking GLSL program failed".

here is my code for second volume as a texture for tagging.

unsigned char * pointer2 =3D new unsigned char[dims2[0]*dims2[1]*dims2[2]];

... here to initialize the volume

// Create the volume texture
vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture
(dims, pointer2, textureType, format); //uses volume1' dims, textureType an=
d
format

texture2->setGeometryROI(geometryROI); // volume1's geometry roi

// Set the "volume" parameter for the appearance
appearance->setParameter("volume2", texture2);
texture2->unref();

then I get the following error when running it:

Volumizer (4): Compile status: 1
Volumizer (4): Info Log:
Volumizer (4): Link status: 0
Volumizer (4): Info Log: Fragment info
-------------
(9) : error C3001: no program defined

Volumizer Warning:
Linking GLSL program 1 failed

In my fragment program, i didnot use the second volume:
static char FragmentShader[] =3D
"void main(){\n"
"vec4 color,color2,color3,color4;\n"
"color =3D texture3D(volume,volume_TexCoord.stp);\n"
"color4 =3D texture1D(lookup_table,color.x);\n"
"gl_FragColor =3D color4;\n"
"}";

Do you have any idea that can help me identify the problem?

Another question is: can I use a 1D texture as a 3D texture for volumizer?

Lastly I would like to know if it is ok to ran this kind of program (i.e.
opengl + fragment_program ) under OpenGL Multipipe environment? We have a
custom developed volume rendering program which uses fragment_program. I
wonder if the OMP can help improve the performance.

Thanks a lot,

-- Kevin

On 10/18/05, Praveen Bhaniramka <praveenb@sgi.com> wrote:
>
> Hi Kevin,
>
> Using multiple lookup tables with Volumizer is pretty trivial. For this
> you need to -
>
> 1. Specify the lookup tables in the corresponding shape's appearance
> using vzParameterLookupTable objects.
> 2. Specify the shader (GPU program) that uses the multiple lookup tables
> to do what you want them to do.
>
> On modern GPUs, lookup tables can be implemented using dependent texture
> lookups. If you are using the ARB_fragment_program extension to write
> your shaders (GPU program), you will also need to provide callback
> routines to bind these dependent textures on specific texture units.
> However, if you are using the ARB_fragment_shader/ARB_shading_language
> extensions (also known as the OpenGL Shading Language), the dependent
> texture setup is done by Volumizer transparently. You simply need to use
> them in your shader. Support for OpenGL Shading Language is available
> with Volumizer 2.9 release.
>
> The CustomShadeViewer example under
> /usr/share/Volumizer2/src/apps/simple/tmRenderAction directory
> demonstrates the use of multiple lookup tables. There are several
> example shaders under /usr/share/Volumizer2/src/shaders to help you get
> started with the shader part as well.
>
> Let us know if you have any further questions.
>
> Cheers,
> Praveen
>
> > -----Original Message-----
> > From: owner-info-volumizer@els.sgi.com
> > [mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Kevin Wang
> > Sent: Tuesday, October 18, 2005 8:22 PM
> > To: Praveen Bhaniramka
> > Cc: info-volumizer@els.sgi.com
> > Subject: [info-volumizer] Multiple Transfer functions for volumizer
> >
> >
> > Hi Praveen and list,
> >
> > I would like to use multiple transfer functions for
> > volumizer. From the
> > volumizer guide, it shows that one can assign a lookup table
> > for certain
> > shaders (LUT, Gradient, etc.)
> >
> > My question is how to download 2 lookup table to GPU and how
> > to access
> > them if I use GPU programming in volumizer.
> >
> > I see the technique using dependent texture for texture
> > lookup table in
> > the guide. I am guessing that this is the way done for the
> > Altix since it
> > uses ATI GPU.
> >
> > Thanks in advance,
> >
> > -- Kevin
> >
>
>

------=_Part_9956_8740564.1129751514284
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Praveen,<br>
<br>
Thanks for your prompt response. I am experimenting it using
ARB_fragment_shader extension now. For one volume using one LUT it
works with my vtkVolumizerTextureMapper class. But once I add one more
volume, it says &quot;Linking GLSL program failed&quot;.<br>
<br>
here is my code for second volume as a texture for tagging.<br>
<br>
&nbsp; unsigned char * pointer2 =3D new unsigned char[dims2[0]*dims2[1]*dim=
s2[2]];<br>
&nbsp; <br>
&nbsp; ... here to initialize the volume<br>
<br>
&nbsp; // Create the volume texture<br>
&nbsp; vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture =
<br>
&nbsp;&nbsp;&nbsp; (dims, pointer2, textureType, format); //uses volume1' d=
ims, textureType and format <br>
&nbsp; <br>
  &nbsp; texture2-&gt;setGeometryROI(geometryROI); // volume1's geometry ro=
i<br>
&nbsp; <br>
&nbsp; // Set the &quot;volume&quot; parameter for the appearance<br>
&nbsp; appearance-&gt;setParameter(&quot;volume2&quot;, texture2);<br>
&nbsp; texture2-&gt;unref();<br>
<br>
then I get the following error when running it:<br>
<br>
Volumizer (4): Compile status: 1<br>
Volumizer (4): Info Log:<br>
Volumizer (4): Link status: 0<br>
Volumizer (4): Info Log: Fragment info<br>
-------------<br>
(9) : error C3001: no program defined<br>
<br>
Volumizer Warning:<br>
Linking GLSL program 1 failed<br>
<br>
In my fragment program, i didnot use the second volume:<br>
static char FragmentShader[] =3D <br>
&quot;void main(){\n&quot;<br>
&quot;vec4 color,color2,color3,color4;\n&quot;<br>
&quot;color =3D texture3D(volume,volume_TexCoord.stp);\n&quot;<br>
&quot;color4 =3D texture1D(lookup_table,color.x);\n&quot;<br>
&quot;gl_FragColor =3D color4;\n&quot;<br>
&quot;}&quot;;<br>
<br>
Do you have any idea that can help me identify the problem? <br>
<br>
Another question is: can I use a 1D texture as a 3D texture for volumizer? =
<br>
<br>
Lastly I would like to know if it is ok to ran this kind of program
(i.e. opengl + fragment_program ) under OpenGL Multipipe environment?
We have a custom developed volume rendering program which uses
fragment_program. I wonder if the OMP can help improve the performance.<br>
<br>
Thanks a lot,<br>
<br>
-- Kevin<br><br><div><span class=3D"gmail_quote">On 10/18/05, <b class=3D"g=
mail_sendername">Praveen Bhaniramka</b> &lt;<a href=3D"mailto:praveenb@sgi.=
com">praveenb@sgi.com</a>&gt; wrote:</span><blockquote class=3D"gmail_quote=
" style=3D"border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0=
.8ex; padding-left: 1ex;">
Hi Kevin,<br><br>Using multiple lookup tables with Volumizer is pretty triv=
ial. For this<br>you need to -<br><br>1. Specify the lookup tables in the c=
orresponding shape's appearance<br>using vzParameterLookupTable objects.
<br>2. Specify the shader (GPU program) that uses the multiple lookup table=
s<br>to do what you want them to do.<br><br>On modern GPUs, lookup tables c=
an be implemented using dependent texture<br>lookups. If you are using the =
ARB_fragment_program extension to write
<br>your shaders (GPU program), you will also need to provide callback<br>r=
outines to bind these dependent textures on specific texture units.<br>Howe=
ver, if you are using the ARB_fragment_shader/ARB_shading_language<br>exten=
sions (also known as the OpenGL Shading Language), the dependent
<br>texture setup is done by Volumizer transparently. You simply need to us=
e<br>them in your shader. Support for OpenGL Shading Language is available<=
br>with Volumizer 2.9 release.<br><br>The CustomShadeViewer example under
<br>/usr/share/Volumizer2/src/apps/simple/tmRenderAction directory<br>demon=
strates the use of multiple lookup tables. There are several<br>example sha=
ders under /usr/share/Volumizer2/src/shaders to help you get<br>started wit=
h the shader part as well.
<br><br>Let us know if you have any further questions.<br><br>Cheers,<br>Pr=
aveen<br><br>&gt; -----Original Message-----<br>&gt; From: <a href=3D"mailt=
o:owner-info-volumizer@els.sgi.com">owner-info-volumizer@els.sgi.com</a><br=
>
&gt; [mailto:<a href=3D"mailto:owner-info-volumizer@els.sgi.com">owner-info=
-volumizer@els.sgi.com</a>] On Behalf Of Kevin Wang<br>&gt; Sent: Tuesday, =
October 18, 2005 8:22 PM<br>&gt; To: Praveen Bhaniramka<br>&gt; Cc: <a href=
=3D"mailto:info-volumizer@els.sgi.com">
info-volumizer@els.sgi.com</a><br>&gt; Subject: [info-volumizer] Multiple T=
ransfer functions for volumizer<br>&gt;<br>&gt;<br>&gt; Hi Praveen and list=
,<br>&gt;<br>&gt; I would like to use multiple transfer functions for<br>
&gt; volumizer. From the<br>&gt; volumizer guide, it shows that one can ass=
ign a lookup table<br>&gt; for certain<br>&gt; shaders (LUT, Gradient, etc.=
)<br>&gt;<br>&gt; My question is how to download 2 lookup table to GPU and =
how
<br>&gt; to access<br>&gt; them if I use GPU programming in volumizer.<br>&=
gt;<br>&gt; I see the technique using dependent texture for texture<br>&gt;=
 lookup table in<br>&gt; the guide. I am guessing that this is the way done=
 for the
<br>&gt; Altix since it<br>&gt; uses ATI GPU.<br>&gt;<br>&gt; Thanks in adv=
ance,<br>&gt;<br>&gt; -- Kevin<br>&gt;<br><br></blockquote></div><br>

------=_Part_9956_8740564.1129751514284--

From info-volumizer-owner@els.sgi.com Thu Oct 20 00:12:58 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9K7Bo2E8513624;
	Thu, 20 Oct 2005 00:11:50 -0700 (PDT)
Received: from internal-mail-relay.corp.sgi.com (internal-mail-relay.corp.sgi.com [198.149.32.51])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9K72NJT1385783
	for <info-volumizer@els.sgi.com>; Thu, 20 Oct 2005 00:02:23 -0700 (PDT)
Received: from mtv-atc-013e--n.corp.sgi.com (mtv-atc-013e--n.corp.sgi.com [192.26.78.50])
	by internal-mail-relay.corp.sgi.com (8.12.9/8.12.10/SGI_generic_relay-1.2) with ESMTP id j9K72N2Z277840849
	for <info-volumizer@els.sgi.com>; Thu, 20 Oct 2005 00:02:23 -0700 (PDT)
Received: from praveenlaptop (134.14.90.92 [134.14.90.92]) by mtv-atc-013e--n.corp.sgi.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2655.55)
	id VAPT9AYJ; Thu, 20 Oct 2005 00:02:20 -0700
From: "Praveen Bhaniramka" <praveenb@sgi.com>
To: <info-volumizer@els.sgi.com>
Subject: RE: [info-volumizer] Multiple Transfer functions for volumizer
Date: Thu, 20 Oct 2005 12:32:08 +0530
Message-ID: <01c901c5d544$355b8590$2e17fea9@asiapac.sgi.com>
MIME-Version: 1.0
Content-Type: multipart/alternative;
	boundary="----=_NextPart_000_01CA_01C5D572.4F13C190"
X-Priority: 3 (Normal)
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook, Build 10.0.2627
In-Reply-To: <f089541f0510191251qf7820ald2ade26691bcc01c@mail.gmail.com>
Importance: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

This is a multi-part message in MIME format.

------=_NextPart_000_01CA_01C5D572.4F13C190
Content-Type: text/plain;
	charset="US-ASCII"
Content-Transfer-Encoding: 7bit

Hi Kevin,
 
It is not clear what the issue is, but definitely it should be perfectly
legal for you to not use the parameter "volume2" in the shader. 
 
Couple of quick tests -
1. Make sure that the system supports GLSL - "glxinfo | grep
ARB_fragment_shader" should show the extension strings. 
2. "setenv VOLUMIZER_DEBUG_LEVEL 5" before running the application. The
shader string that the application passes to Volumizer is manipulated a
little bit internally to make sure that the shader contains all the
necessary parameters for the operations. Please look at the string and
see if it shows anything obviously incorrect. (Feel free to send it my
way and I can take a look as well).
 
> Another question is: can I use a 1D texture as a 3D texture for
volumizer? 
 
I am not sure what you mean by this, but I am guessing that you are
trying to use a 1D texture as a vzParameterVolumeTexture? The minimal
texture dimemsions that Volumizer supports is 4 currently, so if you use
specify a texture with dimensions [n, 1, 1], Volumizer will zero pad it
to [n, 4, 4] and then render it. However, this code path can sometimes
be a little buggy so the best option would be for you to simply create a
texture of size [n, 4, 4] before passing to Volumizer. A simple strategy
for computing the new texture would be to replicate the 1D texture over
the complete data. Hope that makes sense. 
 
I think that OMP should now support ARB_fragment_program extensions on
Prism, but I honestly haven't tried this myself. Please give it a shot
and if something does not work, let me know and pass the info along to
the OMP team. 
 
Cheers,
Praveen
 

-----Original Message-----
From: owner-info-volumizer@els.sgi.com
[mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Kevin Wang
Sent: Thursday, October 20, 2005 1:22 AM
To: info-volumizer@els.sgi.com; praveenb@sgi.com
Subject: Re: [info-volumizer] Multiple Transfer functions for volumizer


Hi Praveen,

Thanks for your prompt response. I am experimenting it using
ARB_fragment_shader extension now. For one volume using one LUT it works
with my vtkVolumizerTextureMapper class. But once I add one more volume,
it says "Linking GLSL program failed".

here is my code for second volume as a texture for tagging.

  unsigned char * pointer2 = new unsigned
char[dims2[0]*dims2[1]*dims2[2]];
  
  ... here to initialize the volume

  // Create the volume texture
  vzParameterVolumeTexture *texture2 = new vzParameterVolumeTexture 
    (dims, pointer2, textureType, format); //uses volume1' dims,
textureType and format 
  
  texture2->setGeometryROI(geometryROI); // volume1's geometry roi
  
  // Set the "volume" parameter for the appearance
  appearance->setParameter("volume2", texture2);
  texture2->unref();

then I get the following error when running it:

Volumizer (4): Compile status: 1
Volumizer (4): Info Log:
Volumizer (4): Link status: 0
Volumizer (4): Info Log: Fragment info
-------------
(9) : error C3001: no program defined

Volumizer Warning:
Linking GLSL program 1 failed

In my fragment program, i didnot use the second volume:
static char FragmentShader[] = 
"void main(){\n"
"vec4 color,color2,color3,color4;\n"
"color = texture3D(volume,volume_TexCoord.stp);\n"
"color4 = texture1D(lookup_table,color.x);\n"
"gl_FragColor = color4;\n"
"}";

Do you have any idea that can help me identify the problem? 

Another question is: can I use a 1D texture as a 3D texture for
volumizer? 

Lastly I would like to know if it is ok to ran this kind of program
(i.e. opengl + fragment_program ) under OpenGL Multipipe environment? We
have a custom developed volume rendering program which uses
fragment_program. I wonder if the OMP can help improve the performance.

Thanks a lot,

-- Kevin


On 10/18/05, Praveen Bhaniramka <praveenb@sgi.com> wrote: 

Hi Kevin,

Using multiple lookup tables with Volumizer is pretty trivial. For this
you need to -

1. Specify the lookup tables in the corresponding shape's appearance
using vzParameterLookupTable objects. 
2. Specify the shader (GPU program) that uses the multiple lookup tables
to do what you want them to do.

On modern GPUs, lookup tables can be implemented using dependent texture
lookups. If you are using the ARB_fragment_program extension to write 
your shaders (GPU program), you will also need to provide callback
routines to bind these dependent textures on specific texture units.
However, if you are using the ARB_fragment_shader/ARB_shading_language
extensions (also known as the OpenGL Shading Language), the dependent 
texture setup is done by Volumizer transparently. You simply need to use
them in your shader. Support for OpenGL Shading Language is available
with Volumizer 2.9 release.

The CustomShadeViewer example under 
/usr/share/Volumizer2/src/apps/simple/tmRenderAction directory
demonstrates the use of multiple lookup tables. There are several
example shaders under /usr/share/Volumizer2/src/shaders to help you get
started with the shader part as well. 

Let us know if you have any further questions.

Cheers,
Praveen

> -----Original Message-----
> From: owner-info-volumizer@els.sgi.com
> [mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Kevin Wang
> Sent: Tuesday, October 18, 2005 8:22 PM
> To: Praveen Bhaniramka
> Cc: info-volumizer@els.sgi.com
> Subject: [info-volumizer] Multiple Transfer functions for volumizer
>
>
> Hi Praveen and list,
>
> I would like to use multiple transfer functions for
> volumizer. From the
> volumizer guide, it shows that one can assign a lookup table
> for certain
> shaders (LUT, Gradient, etc.)
>
> My question is how to download 2 lookup table to GPU and how 
> to access
> them if I use GPU programming in volumizer.
>
> I see the technique using dependent texture for texture
> lookup table in
> the guide. I am guessing that this is the way done for the 
> Altix since it
> uses ATI GPU.
>
> Thanks in advance,
>
> -- Kevin
>





------=_NextPart_000_01CA_01C5D572.4F13C190
Content-Type: text/html;
	charset="US-ASCII"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
charset=3Dus-ascii">
<TITLE>Message</TITLE>

<META content=3D"MSHTML 6.00.2900.2769" name=3DGENERATOR></HEAD>
<BODY>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial size=3D4>Hi=20
Kevin,</FONT></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial=20
size=3D4></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial size=3D4>It is =
not clear what=20
the issue is, but definitely&nbsp;it should be perfectly legal =
for&nbsp;you=20
to&nbsp;not use the parameter "volume2" in the shader. =
</FONT></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial=20
size=3D4></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial size=3D4>Couple =
of quick=20
tests -</FONT></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial size=3D4>1. =
Make sure that=20
the system supports GLSL - "glxinfo | grep ARB_fragment_shader" should =
show the=20
extension strings. </FONT></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial size=3D4>2. =
"setenv=20
VOLUMIZER_DEBUG_LEVEL 5" before running the application. The shader =
string=20
that&nbsp;the application passes to Volumizer is manipulated a little =
bit=20
internally to make sure that the shader contains all the necessary =
parameters=20
for the operations. Please look at the string and see if it shows =
anything=20
obviously incorrect. (Feel free to send it my way and I can take a look =
as=20
well).</FONT></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><FONT face=3DArial=20
size=3D4></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=3D902024806-20102005>&gt; Another question is: can I =
use a 1D=20
texture as a 3D texture for volumizer? </SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4></FONT></SPAN></SPAN>&nbsp;</DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4>I am not sure what you mean by this, but I am =
guessing that=20
you are trying to use a 1D texture as a vzParameterVolumeTexture? The =
minimal=20
texture dimemsions that Volumizer supports is 4 currently, so if you use =
specify=20
a texture&nbsp;with dimensions&nbsp;[n, 1, 1], Volumizer will zero pad =
it to [n,=20
4, 4] and then render it. However, this code path can sometimes be a =
little=20
buggy so the best optio</FONT></SPAN></SPAN><SPAN =
class=3D902024806-20102005><SPAN=20
class=3D902024806-20102005><FONT face=3DArial size=3D4>n would be for =
you to simply=20
create a texture of size [n, 4, 4] before passing to Volumizer. A simple =

strategy for computing the new texture would be to replicate the 1D=20
texture&nbsp;over the complete data. Hope that makes sense.=20
</FONT></SPAN></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4></FONT></SPAN></SPAN>&nbsp;</DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4>I think that OMP should now support =
ARB_fragment_program=20
extensions on Prism, but I honestly haven't tried this myself. Please =
give it a=20
shot and if something does not work, let me know and pass the info along =
to the=20
OMP team. </FONT></SPAN></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4></FONT></SPAN></SPAN>&nbsp;</DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4>Cheers,</FONT></SPAN></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4>Praveen</FONT></SPAN></SPAN></DIV>
<DIV><SPAN class=3D902024806-20102005><SPAN =
class=3D902024806-20102005><FONT=20
face=3DArial size=3D4></FONT></SPAN></SPAN>&nbsp;</DIV>
<BLOCKQUOTE=20
style=3D"PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px =
solid; MARGIN-RIGHT: 0px">
  <DIV></DIV>
  <DIV class=3DOutlookMessageHeader lang=3Den-us dir=3Dltr =
align=3Dleft><FONT=20
  face=3DTahoma size=3D2>-----Original Message-----<BR><B>From:</B>=20
  owner-info-volumizer@els.sgi.com =
[mailto:owner-info-volumizer@els.sgi.com]=20
  <B>On Behalf Of </B>Kevin Wang<BR><B>Sent:</B> Thursday, October 20, =
2005 1:22=20
  AM<BR><B>To:</B> info-volumizer@els.sgi.com;=20
  praveenb@sgi.com<BR><B>Subject:</B> Re: [info-volumizer] Multiple =
Transfer=20
  functions for volumizer<BR><BR></FONT></DIV>Hi Praveen,<BR><BR>Thanks =
for your=20
  prompt response. I am experimenting it using ARB_fragment_shader =
extension=20
  now. For one volume using one LUT it works with my =
vtkVolumizerTextureMapper=20
  class. But once I add one more volume, it says "Linking GLSL program=20
  failed".<BR><BR>here is my code for second volume as a texture for=20
  tagging.<BR><BR>&nbsp; unsigned char * pointer2 =3D new unsigned=20
  char[dims2[0]*dims2[1]*dims2[2]];<BR>&nbsp; <BR>&nbsp; ... here to =
initialize=20
  the volume<BR><BR>&nbsp; // Create the volume texture<BR>&nbsp;=20
  vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture=20
  <BR>&nbsp;&nbsp;&nbsp; (dims, pointer2, textureType, format); //uses =
volume1'=20
  dims, textureType and format <BR>&nbsp; <BR>&nbsp;=20
  texture2-&gt;setGeometryROI(geometryROI); // volume1's geometry =
roi<BR>&nbsp;=20
  <BR>&nbsp; // Set the "volume" parameter for the appearance<BR>&nbsp;=20
  appearance-&gt;setParameter("volume2", texture2);<BR>&nbsp;=20
  texture2-&gt;unref();<BR><BR>then I get the following error when =
running=20
  it:<BR><BR>Volumizer (4): Compile status: 1<BR>Volumizer (4): Info=20
  Log:<BR>Volumizer (4): Link status: 0<BR>Volumizer (4): Info Log: =
Fragment=20
  info<BR>-------------<BR>(9) : error C3001: no program=20
  defined<BR><BR>Volumizer Warning:<BR>Linking GLSL program 1 =
failed<BR><BR>In=20
  my fragment program, i didnot use the second volume:<BR>static char=20
  FragmentShader[] =3D <BR>"void main(){\n"<BR>"vec4=20
  color,color2,color3,color4;\n"<BR>"color =3D=20
  texture3D(volume,volume_TexCoord.stp);\n"<BR>"color4 =3D=20
  texture1D(lookup_table,color.x);\n"<BR>"gl_FragColor =3D=20
  color4;\n"<BR>"}";<BR><BR>Do you have any idea that can help me =
identify the=20
  problem? <BR><BR>Another question is: can I use a 1D texture as a 3D =
texture=20
  for volumizer? <BR><BR>Lastly I would like to know if it is ok to ran =
this=20
  kind of program (i.e. opengl + fragment_program ) under OpenGL =
Multipipe=20
  environment? We have a custom developed volume rendering program which =
uses=20
  fragment_program. I wonder if the OMP can help improve the=20
  performance.<BR><BR>Thanks a lot,<BR><BR>-- Kevin<BR><BR>
  <DIV><SPAN class=3Dgmail_quote>On 10/18/05, <B =
class=3Dgmail_sendername>Praveen=20
  Bhaniramka</B> &lt;<A =
href=3D"mailto:praveenb@sgi.com">praveenb@sgi.com</A>&gt;=20
  wrote:</SPAN>
  <BLOCKQUOTE class=3Dgmail_quote=20
  style=3D"PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: =
rgb(204,204,204) 1px solid">Hi=20
    Kevin,<BR><BR>Using multiple lookup tables with Volumizer is pretty =
trivial.=20
    For this<BR>you need to -<BR><BR>1. Specify the lookup tables in the =

    corresponding shape's appearance<BR>using vzParameterLookupTable =
objects.=20
    <BR>2. Specify the shader (GPU program) that uses the multiple =
lookup=20
    tables<BR>to do what you want them to do.<BR><BR>On modern GPUs, =
lookup=20
    tables can be implemented using dependent texture<BR>lookups. If you =
are=20
    using the ARB_fragment_program extension to write <BR>your shaders =
(GPU=20
    program), you will also need to provide callback<BR>routines to bind =
these=20
    dependent textures on specific texture units.<BR>However, if you are =
using=20
    the ARB_fragment_shader/ARB_shading_language<BR>extensions (also =
known as=20
    the OpenGL Shading Language), the dependent <BR>texture setup is =
done by=20
    Volumizer transparently. You simply need to use<BR>them in your =
shader.=20
    Support for OpenGL Shading Language is available<BR>with Volumizer =
2.9=20
    release.<BR><BR>The CustomShadeViewer example under=20
    <BR>/usr/share/Volumizer2/src/apps/simple/tmRenderAction=20
    directory<BR>demonstrates the use of multiple lookup tables. There =
are=20
    several<BR>example shaders under /usr/share/Volumizer2/src/shaders =
to help=20
    you get<BR>started with the shader part as well. <BR><BR>Let us know =
if you=20
    have any further questions.<BR><BR>Cheers,<BR>Praveen<BR><BR>&gt;=20
    -----Original Message-----<BR>&gt; From: <A=20
    =
href=3D"mailto:owner-info-volumizer@els.sgi.com">owner-info-volumizer@els=
.sgi.com</A><BR>&gt;=20
    [mailto:<A=20
    =
href=3D"mailto:owner-info-volumizer@els.sgi.com">owner-info-volumizer@els=
.sgi.com</A>]=20
    On Behalf Of Kevin Wang<BR>&gt; Sent: Tuesday, October 18, 2005 8:22 =

    PM<BR>&gt; To: Praveen Bhaniramka<BR>&gt; Cc: <A=20
    =
href=3D"mailto:info-volumizer@els.sgi.com">info-volumizer@els.sgi.com</A>=
<BR>&gt;=20
    Subject: [info-volumizer] Multiple Transfer functions for=20
    volumizer<BR>&gt;<BR>&gt;<BR>&gt; Hi Praveen and =
list,<BR>&gt;<BR>&gt; I=20
    would like to use multiple transfer functions for<BR>&gt; volumizer. =
From=20
    the<BR>&gt; volumizer guide, it shows that one can assign a lookup=20
    table<BR>&gt; for certain<BR>&gt; shaders (LUT, Gradient,=20
    etc.)<BR>&gt;<BR>&gt; My question is how to download 2 lookup table =
to GPU=20
    and how <BR>&gt; to access<BR>&gt; them if I use GPU programming in=20
    volumizer.<BR>&gt;<BR>&gt; I see the technique using dependent =
texture for=20
    texture<BR>&gt; lookup table in<BR>&gt; the guide. I am guessing =
that this=20
    is the way done for the <BR>&gt; Altix since it<BR>&gt; uses ATI=20
    GPU.<BR>&gt;<BR>&gt; Thanks in advance,<BR>&gt;<BR>&gt; --=20
    =
Kevin<BR>&gt;<BR><BR></BLOCKQUOTE></DIV><BR></BLOCKQUOTE></BODY></HTML>

------=_NextPart_000_01CA_01C5D572.4F13C190--


From info-volumizer-owner@els.sgi.com Thu Oct 20 21:55:53 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9L4sciJ8564478;
	Thu, 20 Oct 2005 21:54:38 -0700 (PDT)
Received: from qproxy.gmail.com (qproxy.gmail.com [72.14.204.205])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9KGJoJT8478717
	for <info-volumizer@els.sgi.com>; Thu, 20 Oct 2005 09:19:51 -0700 (PDT)
Received: by qproxy.gmail.com with SMTP id q18so140748qba
        for <info-volumizer@els.sgi.com>; Thu, 20 Oct 2005 09:19:49 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references;
        b=Ai7zmFPo9uNEzsxIWoNhFY5TeFRamyiFV3vf6EGxb2wxaKb/tCcTcFl27dA0q7c0F/GoKiYXvoBU8fEaWfmDrBgnaGrS6UfeRxhN2+seH6Cc+l6w8a05CNlEFq1nEzX2qxu/y5qEbY/Kmqfnf0Pj/cLYTU65/w/grGalWlbaDvg=
Received: by 10.65.132.14 with SMTP id j14mr1611551qbn;
        Thu, 20 Oct 2005 09:19:49 -0700 (PDT)
Received: by 10.65.155.14 with HTTP; Thu, 20 Oct 2005 09:19:49 -0700 (PDT)
Message-ID: <f089541f0510200919v9ef3e00u430be0b3ed912609@mail.gmail.com>
Date: Thu, 20 Oct 2005 12:19:49 -0400
From: Kevin Wang <kwang22@gmail.com>
To: info-volumizer@els.sgi.com, praveenb@sgi.com
Subject: Re: [info-volumizer] Multiple Transfer functions for volumizer
In-Reply-To: <01c901c5d544$355b8590$2e17fea9@asiapac.sgi.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_5059_15665927.1129825189267"
References: <f089541f0510191251qf7820ald2ade26691bcc01c@mail.gmail.com>
	 <01c901c5d544$355b8590$2e17fea9@asiapac.sgi.com>
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

------=_Part_5059_15665927.1129825189267
Content-Type: multipart/alternative; 
	boundary="----=_Part_5060_29164103.1129825189267"

------=_Part_5060_29164103.1129825189267
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Praveen,

Thanks for your reply. I am attaching the debug output to you. One thing I
noticed is that there is a strange character before " void main()" in my
shading program. I am not sure if this is the reason. But when I use only
one volume, there is no strange character in front of that.

-- Kevin

On 10/20/05, Praveen Bhaniramka <praveenb@sgi.com> wrote:
>
> Hi Kevin,
>  It is not clear what the issue is, but definitely it should be perfectly
> legal for you to not use the parameter "volume2" in the shader.
>  Couple of quick tests -
> 1. Make sure that the system supports GLSL - "glxinfo | grep
> ARB_fragment_shader" should show the extension strings.
> 2. "setenv VOLUMIZER_DEBUG_LEVEL 5" before running the application. The
> shader string that the application passes to Volumizer is manipulated a
> little bit internally to make sure that the shader contains all the
> necessary parameters for the operations. Please look at the string and se=
e
> if it shows anything obviously incorrect. (Feel free to send it my way an=
d I
> can take a look as well).
>  > Another question is: can I use a 1D texture as a 3D texture for
> volumizer?
>  I am not sure what you mean by this, but I am guessing that you are
> trying to use a 1D texture as a vzParameterVolumeTexture? The minimal
> texture dimemsions that Volumizer supports is 4 currently, so if you use
> specify a texture with dimensions [n, 1, 1], Volumizer will zero pad it t=
o
> [n, 4, 4] and then render it. However, this code path can sometimes be a
> little buggy so the best option would be for you to simply create a
> texture of size [n, 4, 4] before passing to Volumizer. A simple strategy =
for
> computing the new texture would be to replicate the 1D texture over the
> complete data. Hope that makes sense.
>  I think that OMP should now support ARB_fragment_program extensions on
> Prism, but I honestly haven't tried this myself. Please give it a shot an=
d
> if something does not work, let me know and pass the info along to the OM=
P
> team.
>  Cheers,
> Praveen
>
>  -----Original Message-----
> *From:* owner-info-volumizer@els.sgi.com [mailto:
> owner-info-volumizer@els.sgi.com] *On Behalf Of *Kevin Wang
> *Sent:* Thursday, October 20, 2005 1:22 AM
> *To:* info-volumizer@els.sgi.com; praveenb@sgi.com
> *Subject:* Re: [info-volumizer] Multiple Transfer functions for volumizer
>
> Hi Praveen,
>
> Thanks for your prompt response. I am experimenting it using
> ARB_fragment_shader extension now. For one volume using one LUT it works
> with my vtkVolumizerTextureMapper class. But once I add one more volume, =
it
> says "Linking GLSL program failed".
>
> here is my code for second volume as a texture for tagging.
>
> unsigned char * pointer2 =3D new unsigned char[dims2[0]*dims2[1]*dims2[2]=
];
>
> ... here to initialize the volume
>
> // Create the volume texture
> vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture
> (dims, pointer2, textureType, format); //uses volume1' dims, textureType
> and format
>
> texture2->setGeometryROI(geometryROI); // volume1's geometry roi
>
> // Set the "volume" parameter for the appearance
> appearance->setParameter("volume2", texture2);
> texture2->unref();
>
> then I get the following error when running it:
>
> Volumizer (4): Compile status: 1
> Volumizer (4): Info Log:
> Volumizer (4): Link status: 0
> Volumizer (4): Info Log: Fragment info
> -------------
> (9) : error C3001: no program defined
>
> Volumizer Warning:
> Linking GLSL program 1 failed
>
> In my fragment program, i didnot use the second volume:
> static char FragmentShader[] =3D
> "void main(){\n"
> "vec4 color,color2,color3,color4;\n"
> "color =3D texture3D(volume,volume_TexCoord.stp);\n"
> "color4 =3D texture1D(lookup_table,color.x);\n"
> "gl_FragColor =3D color4;\n"
> "}";
>
> Do you have any idea that can help me identify the problem?
>
> Another question is: can I use a 1D texture as a 3D texture for volumizer=
?
>
>
> Lastly I would like to know if it is ok to ran this kind of program (i.e.
> opengl + fragment_program ) under OpenGL Multipipe environment? We have a
> custom developed volume rendering program which uses fragment_program. I
> wonder if the OMP can help improve the performance.
>
> Thanks a lot,
>
> -- Kevin
>
> On 10/18/05, Praveen Bhaniramka <praveenb@sgi.com> wrote:
> >
> > Hi Kevin,
> >
> > Using multiple lookup tables with Volumizer is pretty trivial. For this
> > you need to -
> >
> > 1. Specify the lookup tables in the corresponding shape's appearance
> > using vzParameterLookupTable objects.
> > 2. Specify the shader (GPU program) that uses the multiple lookup table=
s
> > to do what you want them to do.
> >
> > On modern GPUs, lookup tables can be implemented using dependent textur=
e
> > lookups. If you are using the ARB_fragment_program extension to write
> > your shaders (GPU program), you will also need to provide callback
> > routines to bind these dependent textures on specific texture units.
> > However, if you are using the ARB_fragment_shader/ARB_shading_language
> > extensions (also known as the OpenGL Shading Language), the dependent
> > texture setup is done by Volumizer transparently. You simply need to us=
e
> > them in your shader. Support for OpenGL Shading Language is available
> > with Volumizer 2.9 release.
> >
> > The CustomShadeViewer example under
> > /usr/share/Volumizer2/src/apps/simple/tmRenderAction directory
> > demonstrates the use of multiple lookup tables. There are several
> > example shaders under /usr/share/Volumizer2/src/shaders to help you get
> > started with the shader part as well.
> >
> > Let us know if you have any further questions.
> >
> > Cheers,
> > Praveen
> >
> > > -----Original Message-----
> > > From: owner-info-volumizer@els.sgi.com
> > > [mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Kevin Wang
> > > Sent: Tuesday, October 18, 2005 8:22 PM
> > > To: Praveen Bhaniramka
> > > Cc: info-volumizer@els.sgi.com
> > > Subject: [info-volumizer] Multiple Transfer functions for volumizer
> > >
> > >
> > > Hi Praveen and list,
> > >
> > > I would like to use multiple transfer functions for
> > > volumizer. From the
> > > volumizer guide, it shows that one can assign a lookup table
> > > for certain
> > > shaders (LUT, Gradient, etc.)
> > >
> > > My question is how to download 2 lookup table to GPU and how
> > > to access
> > > them if I use GPU programming in volumizer.
> > >
> > > I see the technique using dependent texture for texture
> > > lookup table in
> > > the guide. I am guessing that this is the way done for the
> > > Altix since it
> > > uses ATI GPU.
> > >
> > > Thanks in advance,
> > >
> > > -- Kevin
> > >
> >
> >
>

------=_Part_5060_29164103.1129825189267
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Praveen, <br>
<br>
Thanks for your reply. I am attaching the debug output to you. One
thing I noticed is that there is a strange character before &quot; void
main()&quot; in my shading program. I am not sure if this is the reason. Bu=
t
when I use only one volume, there is no strange character in front of
that. <br>
<br>
-- Kevin<br><br><div><span class=3D"gmail_quote">On 10/20/05, <b class=3D"g=
mail_sendername">Praveen Bhaniramka</b> &lt;<a href=3D"mailto:praveenb@sgi.=
com">praveenb@sgi.com</a>&gt; wrote:</span><blockquote class=3D"gmail_quote=
" style=3D"border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0=
.8ex; padding-left: 1ex;">







<div><span><font face=3D"Arial" size=3D"4">Hi=20
Kevin,</font></span></div>
<div><span><font face=3D"Arial" size=3D"4"></font></span>&nbsp;</div>
<div><span><font face=3D"Arial" size=3D"4">It is not clear what=20
the issue is, but definitely&nbsp;it should be perfectly legal for&nbsp;you=
=20
to&nbsp;not use the parameter &quot;volume2&quot; in the shader. </font></s=
pan></div>
<div><span><font face=3D"Arial" size=3D"4"></font></span>&nbsp;</div>
<div><span><font face=3D"Arial" size=3D"4">Couple of quick=20
tests -</font></span></div>
<div><span><font face=3D"Arial" size=3D"4">1. Make sure that=20
the system supports GLSL - &quot;glxinfo | grep ARB_fragment_shader&quot; s=
hould show the=20
extension strings. </font></span></div>
<div><span><font face=3D"Arial" size=3D"4">2. &quot;setenv=20
VOLUMIZER_DEBUG_LEVEL 5&quot; before running the application. The shader st=
ring=20
that&nbsp;the application passes to Volumizer is manipulated a little bit=
=20
internally to make sure that the shader contains all the necessary paramete=
rs=20
for the operations. Please look at the string and see if it shows anything=
=20
obviously incorrect. (Feel free to send it my way and I can take a look as=
=20
well).</font></span></div><span class=3D"q">
<div><span><font face=3D"Arial" size=3D"4"></font></span>&nbsp;</div>
<div><span>&gt; Another question is: can I use a 1D=20
texture as a 3D texture for volumizer? </span></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div></span>
<div><span><span><font face=3D"Arial" size=3D"4">I am not sure what you mea=
n by this, but I am guessing that=20
you are trying to use a 1D texture as a vzParameterVolumeTexture? The minim=
al=20
texture dimemsions that Volumizer supports is 4 currently, so if you use sp=
ecify=20
a texture&nbsp;with dimensions&nbsp;[n, 1, 1], Volumizer will zero pad it t=
o [n,=20
4, 4] and then render it. However, this code path can sometimes be a little=
=20
buggy so the best optio</font></span></span><span><span><font face=3D"Arial=
" size=3D"4">n would be for you to simply=20
create a texture of size [n, 4, 4] before passing to Volumizer. A simple=20
strategy for computing the new texture would be to replicate the 1D=20
texture&nbsp;over the complete data. Hope that makes sense.=20
</font></span></span></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div>
<div><span><span><font face=3D"Arial" size=3D"4">I think that OMP should no=
w support ARB_fragment_program=20
extensions on Prism, but I honestly haven't tried this myself. Please give =
it a=20
shot and if something does not work, let me know and pass the info along to=
 the=20
OMP team. </font></span></span></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div>
<div><span><span><font face=3D"Arial" size=3D"4">Cheers,</font></span></spa=
n></div>
<div><span><span><font face=3D"Arial" size=3D"4">Praveen</font></span></spa=
n></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div>
<blockquote style=3D"border-left: 2px solid rgb(0, 0, 0); padding-left: 5px=
; margin-left: 5px; margin-right: 0px;">
  <div></div>
  <div align=3D"left" dir=3D"ltr" lang=3D"en-us"><font face=3D"Tahoma" size=
=3D"2"><span class=3D"q">-----Original Message-----<br><b>From:</b>=20
  <a href=3D"mailto:owner-info-volumizer@els.sgi.com" target=3D"_blank" onc=
lick=3D"return top.js.OpenExtLink(window,event,this)">owner-info-volumizer@=
els.sgi.com</a> [mailto:<a href=3D"mailto:owner-info-volumizer@els.sgi.com"=
 target=3D"_blank" onclick=3D"return top.js.OpenExtLink(window,event,this)"=
>
owner-info-volumizer@els.sgi.com</a>]=20
  <b>On Behalf Of </b>Kevin Wang<br></span></font><div><span class=3D"e" id=
=3D"q_1070d0187eee4e98_4"><font face=3D"Tahoma" size=3D"2"><b>Sent:</b> Thu=
rsday, October 20, 2005 1:22=20
  AM<br><b>To:</b> <a href=3D"mailto:info-volumizer@els.sgi.com" target=3D"=
_blank" onclick=3D"return top.js.OpenExtLink(window,event,this)">info-volum=
izer@els.sgi.com</a>;=20
  <a href=3D"mailto:praveenb@sgi.com" target=3D"_blank" onclick=3D"return t=
op.js.OpenExtLink(window,event,this)">praveenb@sgi.com</a><br><b>Subject:</=
b> Re: [info-volumizer] Multiple Transfer=20
  functions for volumizer<br><br></font></span></div></div><div><span class=
=3D"e" id=3D"q_1070d0187eee4e98_6">Hi Praveen,<br><br>Thanks for your=20
  prompt response. I am experimenting it using ARB_fragment_shader extensio=
n=20
  now. For one volume using one LUT it works with my vtkVolumizerTextureMap=
per=20
  class. But once I add one more volume, it says &quot;Linking GLSL program=
=20
  failed&quot;.<br><br>here is my code for second volume as a texture for=
=20
  tagging.<br><br>&nbsp; unsigned char * pointer2 =3D new unsigned=20
  char[dims2[0]*dims2[1]*dims2[2]];<br>&nbsp; <br>&nbsp; ... here to initia=
lize=20
  the volume<br><br>&nbsp; // Create the volume texture<br>&nbsp;=20
  vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture=20
  <br>&nbsp;&nbsp;&nbsp; (dims, pointer2, textureType, format); //uses volu=
me1'=20
  dims, textureType and format <br>&nbsp; <br>&nbsp;=20
  texture2-&gt;setGeometryROI(geometryROI); // volume1's geometry roi<br>&n=
bsp;=20
  <br>&nbsp; // Set the &quot;volume&quot; parameter for the appearance<br>=
&nbsp;=20
  appearance-&gt;setParameter(&quot;volume2&quot;, texture2);<br>&nbsp;=20
  texture2-&gt;unref();<br><br>then I get the following error when running=
=20
  it:<br><br>Volumizer (4): Compile status: 1<br>Volumizer (4): Info=20
  Log:<br>Volumizer (4): Link status: 0<br>Volumizer (4): Info Log: Fragmen=
t=20
  info<br>-------------<br>(9) : error C3001: no program=20
  defined<br><br>Volumizer Warning:<br>Linking GLSL program 1 failed<br><br=
>In=20
  my fragment program, i didnot use the second volume:<br>static char=20
  FragmentShader[] =3D <br>&quot;void main(){\n&quot;<br>&quot;vec4=20
  color,color2,color3,color4;\n&quot;<br>&quot;color =3D=20
  texture3D(volume,volume_TexCoord.stp);\n&quot;<br>&quot;color4 =3D=20
  texture1D(lookup_table,color.x);\n&quot;<br>&quot;gl_FragColor =3D=20
  color4;\n&quot;<br>&quot;}&quot;;<br><br>Do you have any idea that can he=
lp me identify the=20
  problem? <br><br>Another question is: can I use a 1D texture as a 3D text=
ure=20
  for volumizer? <br><br>Lastly I would like to know if it is ok to ran thi=
s=20
  kind of program (i.e. opengl + fragment_program ) under OpenGL Multipipe=
=20
  environment? We have a custom developed volume rendering program which us=
es=20
  fragment_program. I wonder if the OMP can help improve the=20
  performance.<br><br>Thanks a lot,<br><br>-- Kevin<br><br>
  <div><span class=3D"gmail_quote">On 10/18/05, <b class=3D"gmail_sendernam=
e">Praveen=20
  Bhaniramka</b> &lt;<a href=3D"mailto:praveenb@sgi.com" target=3D"_blank" =
onclick=3D"return top.js.OpenExtLink(window,event,this)">praveenb@sgi.com</=
a>&gt;=20
  wrote:</span>
  <blockquote class=3D"gmail_quote" style=3D"border-left: 1px solid rgb(204=
, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi=20
    Kevin,<br><br>Using multiple lookup tables with Volumizer is pretty tri=
vial.=20
    For this<br>you need to -<br><br>1. Specify the lookup tables in the=20
    corresponding shape's appearance<br>using vzParameterLookupTable object=
s.=20
    <br>2. Specify the shader (GPU program) that uses the multiple lookup=
=20
    tables<br>to do what you want them to do.<br><br>On modern GPUs, lookup=
=20
    tables can be implemented using dependent texture<br>lookups. If you ar=
e=20
    using the ARB_fragment_program extension to write <br>your shaders (GPU=
=20
    program), you will also need to provide callback<br>routines to bind th=
ese=20
    dependent textures on specific texture units.<br>However, if you are us=
ing=20
    the ARB_fragment_shader/ARB_shading_language<br>extensions (also known =
as=20
    the OpenGL Shading Language), the dependent <br>texture setup is done b=
y=20
    Volumizer transparently. You simply need to use<br>them in your shader.=
=20
    Support for OpenGL Shading Language is available<br>with Volumizer 2.9=
=20
    release.<br><br>The CustomShadeViewer example under=20
    <br>/usr/share/Volumizer2/src/apps/simple/tmRenderAction=20
    directory<br>demonstrates the use of multiple lookup tables. There are=
=20
    several<br>example shaders under /usr/share/Volumizer2/src/shaders to h=
elp=20
    you get<br>started with the shader part as well. <br><br>Let us know if=
 you=20
    have any further questions.<br><br>Cheers,<br>Praveen<br><br>&gt;=20
    -----Original Message-----<br>&gt; From: <a href=3D"mailto:owner-info-v=
olumizer@els.sgi.com" target=3D"_blank" onclick=3D"return top.js.OpenExtLin=
k(window,event,this)">owner-info-volumizer@els.sgi.com</a><br>&gt;=20
    [mailto:<a href=3D"mailto:owner-info-volumizer@els.sgi.com" target=3D"_=
blank" onclick=3D"return top.js.OpenExtLink(window,event,this)">owner-info-=
volumizer@els.sgi.com</a>]=20
    On Behalf Of Kevin Wang<br>&gt; Sent: Tuesday, October 18, 2005 8:22=20
    PM<br>&gt; To: Praveen Bhaniramka<br>&gt; Cc: <a href=3D"mailto:info-vo=
lumizer@els.sgi.com" target=3D"_blank" onclick=3D"return top.js.OpenExtLink=
(window,event,this)">info-volumizer@els.sgi.com</a><br>&gt;=20
    Subject: [info-volumizer] Multiple Transfer functions for=20
    volumizer<br>&gt;<br>&gt;<br>&gt; Hi Praveen and list,<br>&gt;<br>&gt; =
I=20
    would like to use multiple transfer functions for<br>&gt; volumizer. Fr=
om=20
    the<br>&gt; volumizer guide, it shows that one can assign a lookup=20
    table<br>&gt; for certain<br>&gt; shaders (LUT, Gradient,=20
    etc.)<br>&gt;<br>&gt; My question is how to download 2 lookup table to =
GPU=20
    and how <br>&gt; to access<br>&gt; them if I use GPU programming in=20
    volumizer.<br>&gt;<br>&gt; I see the technique using dependent texture =
for=20
    texture<br>&gt; lookup table in<br>&gt; the guide. I am guessing that t=
his=20
    is the way done for the <br>&gt; Altix since it<br>&gt; uses ATI=20
    GPU.<br>&gt;<br>&gt; Thanks in advance,<br>&gt;<br>&gt; --=20
    Kevin<br>&gt;<br><br></blockquote></div><br></span></div></blockquote>

</blockquote></div><br>

------=_Part_5060_29164103.1129825189267--

------=_Part_5059_15665927.1129825189267
Content-Type: text/plain; name=VolumizerDebug.txt; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="VolumizerDebug.txt"

[kwang@polygon examples]$ python tkvolumizer.py sbrain.mnc
Initializing debug Level to: 5
Volumizer (3): =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
Volumizer (3): Checking for 'volumizer_linux' license
Volumizer (1): =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
Volumizer (1): =3D             OpenGL Volumizer 2.9             =3D
Volumizer (1): =3D                 FULL EDITION                 =3D
Volumizer (1): =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
Volumizer (4): Object 85d2010 ref() -> Ref count =3D 2
Volumizer (4): Object 85d2010 unref() -> Ref count =3D 1
Data dimensions =3D 64, 64, 64
Volumizer (1): Texture type =3D VZ_UNSIGNED_BYTE
Volumizer (1): Number of Components =3D 1
Volumizer (4): Object 85d2198 ref() -> Ref count =3D 2
Volumizer (4): Object 85d2198 unref() -> Ref count =3D 1
Volumizer (4): Object 85d22c0 ref() -> Ref count =3D 2
Volumizer (4): Object 85d22c0 unref() -> Ref count =3D 1
Volumizer (4): Object 85d33f0 ref() -> Ref count =3D 2
Volumizer (4): Object 85d33f0 unref() -> Ref count =3D 1
Volumizer (4): Object 85d1e48 ref() -> Ref count =3D 2
Volumizer (4): Object 85d20e8 ref() -> Ref count =3D 2
Volumizer (4): Object 85d1e48 unref() -> Ref count =3D 1
Volumizer (4): Object 85d20e8 unref() -> Ref count =3D 1
Volumizer (5): Client attribute stack maximum depth =3D 16
Volumizer (4): Vendor string =3D NVIDIA Corporation
Volumizer (4): Renderer string =3D GeForce FX Go5200 32M/64M/AGP/SSE2
Volumizer (2): GeForce FX graphics
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): ARBImaging =3D yes
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): ARBFragmentProgram =3D yes
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): ARBVertexProgram =3D yes
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): ARBFragmentShader =3D yes
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): ARBVertexShader =3D yes
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): ATIFragmentShader =3D no
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): SGITextureColorTable =3D n=
o
Volumizer (5): vzPlatformInfo::vzPlatformInfo(): SGIColorMatrix =3D no
Volumizer (3): ARBFragmentProgram::init(): GL_ARB_fragment_program supporte=
d
Volumizer (3): ARBFragmentShader::init(): GL_ARB_fragment_shader supported
Volumizer (3): vzRenderAction::manage : Number of shapes currently managed =
=3D 0
Volumizer (3): Shape 85d34d0 has 2 volume textures
Volumizer (3): Total size for all the textures =3D 524288, maximum texture =
memory =3D 134217728
Volumizer (4): Object 85d34d0 ref() -> Ref count =3D 2
Volumizer (4): Object 85d20e8 ref() -> Ref count =3D 2
Volumizer (4): Object 85d33f0 ref() -> Ref count =3D 2
Volumizer (4): Object 85d2010 ref() -> Ref count =3D 2
Volumizer (5): Number of parameters =3D 3
Volumizer (5): Generated Fragment Shader string =3D
uniform sampler1D lookup_table;
vec4 lookup_table_TexCoord =3D gl_TexCoord[0];
vec4 volume_TexCoord =3D gl_TexCoord[1];
uniform sampler3D volume;
uniform vec3 volume_TexDims;
vec4 volume2_TexCoord =3D gl_TexCoord[2];
uniform sampler3D volume2;
uniform vec3 volume2_TexDims;
=1B%G=C3=AF=C2=BF=C2=BD=1B%@void main(){
vec4 color,color2,color3,color4;
color =3D texture3D(volume,volume_TexCoord.stp);
//color2 =3D texture3D(volume2,volume2_TexCoord.stp);
color4 =3D texture1D(lookup_table,color.x);
gl_FragColor =3D color4;
}
Volumizer (5): TMInternalGPUShaderImpl::initShader(): Generated fragment sh=
ader 1
Volumizer (5): This works fine after binding the shader
Volumizer (4): Compile status: 1
Volumizer (4): Info Log:
Volumizer (4): Link status: 0
Volumizer (4): Info Log: Fragment info
-------------
(9) : error C3001: no program defined

Volumizer Warning:
Linking GLSL program 1 failed
Volumizer (5): TMGeneralShader::initialize(): Generated fragment shader 1
Volumizer (4): Object 85d2198 ref() -> Ref count =3D 2
Volumizer (4): Object 85d22c0 ref() -> Ref count =3D 2
Volumizer (5): Pixelstore settings: SKIP_PIXELS: 0, SKIP_ROWS: 0, SKIP_IMAG=
ES: 0, ROW_LENGTH: 64, IMAGE_HEIGHT: 64
Volumizer (5): glTexImage3D called for (64 x 64 x 64) texture (loading into=
 (64 x 64 x 64) texture), data ptr =3D b36b7008, ID =3D 1
Volumizer (5): Pixelstore settings: SKIP_PIXELS: 0, SKIP_ROWS: 0, SKIP_IMAG=
ES: 0, ROW_LENGTH: 64, IMAGE_HEIGHT: 64
Volumizer (5): glTexImage3D called for (64 x 64 x 64) texture (loading into=
 (64 x 64 x 64) texture), data ptr =3D b36b7008, ID =3D 2
Volumizer (5): vzTMRenderAction: Total texture memory consumed: 524288
Volumizer (5): TMGeneralShader::bindParameter(): Number of parameters =3D 3
Volumizer Warning:
ARBFragmentShader::bindVolumeTexture(): Location -1 returned for lookup_tab=
le
Volumizer Warning:
ARBFragmentShader::bindVolumeTexture(): Location -1 returned for volume
Volumizer Warning:
ARBFragmentShader::bindVolumeTexture(): Location -1 returned for volume2
Volumizer (4): Object 85d1e48 ref() -> Ref count =3D 2
Volumizer (4): Object 85dc088 ref() -> Ref count =3D 2
Volumizer (4): Object 85dc008 ref() -> Ref count =3D 2
Volumizer (4): Object 85dc008 unref() -> Ref count =3D 1
Volumizer (4): Object 85dc088 unref() -> Ref count =3D 1
Volumizer (3): Computing adjacency list...
Volumizer (4): Object 8bfec20 ref() -> Ref count =3D 2
Volumizer (4): Object 8bfec20 unref() -> Ref count =3D 1

------=_Part_5059_15665927.1129825189267--

From info-volumizer-owner@els.sgi.com Thu Oct 20 21:55:53 2005
Received: (from majordom@localhost)
	by els.sgi.com (8.12.10/8.12.2/els-2.2) id j9L4t9ho8489933;
	Thu, 20 Oct 2005 21:55:09 -0700 (PDT)
Received: from qproxy.gmail.com (qproxy.gmail.com [72.14.204.201])
	by els.sgi.com (8.12.10/8.12.2/els-2.2) with ESMTP id j9KLBvJT8514784
	for <info-volumizer@els.sgi.com>; Thu, 20 Oct 2005 14:11:58 -0700 (PDT)
Received: by qproxy.gmail.com with SMTP id q18so203700qba
        for <info-volumizer@els.sgi.com>; Thu, 20 Oct 2005 14:11:56 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references;
        b=OnIZn/gl9IA0GuuEPwsgLFgVeQr6nKJyRtUk96GIQwRvKMBblgfiDnR0uk+j51iaUgp/LYYMz296bF0gXANnSf1TopK11MKJjQW9zocTPnaAhzDJ/kyF11pc6H43OZeTStNtBID2JBDX8TIF7OQA7e/nANkozSURL71V1+4/zpQ=
Received: by 10.65.148.15 with SMTP id a15mr1812543qbo;
        Thu, 20 Oct 2005 14:11:56 -0700 (PDT)
Received: by 10.65.155.14 with HTTP; Thu, 20 Oct 2005 14:11:56 -0700 (PDT)
Message-ID: <f089541f0510201411k2f32be22h7803eb44a6a1a5c7@mail.gmail.com>
Date: Thu, 20 Oct 2005 17:11:56 -0400
From: Kevin Wang <kwang22@gmail.com>
To: info-volumizer@els.sgi.com
Subject: Re: [info-volumizer] Multiple Transfer functions for volumizer
In-Reply-To: <01c901c5d544$355b8590$2e17fea9@asiapac.sgi.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_10336_32850051.1129842716375"
References: <f089541f0510191251qf7820ald2ade26691bcc01c@mail.gmail.com>
	 <01c901c5d544$355b8590$2e17fea9@asiapac.sgi.com>
Sender: owner-info-volumizer@els.sgi.com
Precedence: bulk
Reply-To: info-volumizer@els.sgi.com

------=_Part_10336_32850051.1129842716375
Content-Type: multipart/alternative; 
	boundary="----=_Part_10337_6188013.1129842716375"

------=_Part_10337_6188013.1129842716375
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Praveen,

Fortunately after I add second lookup table to the shader, the problem goes
way. I think the problem is related to the shader string. Although I am not
sure what it exactly is.

Now I have another question. If I use a second volume as the tagging volume
as the TagShader does in Volumizer, if the second volume dimensions are sam=
e
as the first, then the volume shows up correctly. but if my second volume
dimensions are not same as the first, let say the first is 128*128*128 and
the second is 8*8*8, then the volume shows up like subsampling using the
second volume even though I did not use any value from the texture sampling
of volume2.

The reason I want different dimension on second volume is that I want to
keep it small so I can dynamically change the tagging area and download thi=
s
volume to GPU. Otherwise the downloading will be a pain.

below is the shader program, you can see that I do not use the result from
the second volume:
static char FragmentShader[] =3D
"void main(){\n"
"vec4 color,color2,color3,color4,color5;\n"
"color =3D texture3D(volume,volume_TexCoord.stp);\n"
"color2 =3D texture3D(volume1,volume1_TexCoord.stp);\n"
"color4 =3D texture1D(lookup_table,color.x);\n"
"color5 =3D texture1D(lookup_table2,color2.x);\n"
"gl_FragColor =3D color4;\n"
"}";

I also attached the pictures using full resolution and subsampled resultion
of second volume.

-- Kevin

On 10/20/05, Praveen Bhaniramka <praveenb@sgi.com> wrote:
>
> Hi Kevin,
>  It is not clear what the issue is, but definitely it should be perfectly
> legal for you to not use the parameter "volume2" in the shader.
>  Couple of quick tests -
> 1. Make sure that the system supports GLSL - "glxinfo | grep
> ARB_fragment_shader" should show the extension strings.
> 2. "setenv VOLUMIZER_DEBUG_LEVEL 5" before running the application. The
> shader string that the application passes to Volumizer is manipulated a
> little bit internally to make sure that the shader contains all the
> necessary parameters for the operations. Please look at the string and se=
e
> if it shows anything obviously incorrect. (Feel free to send it my way an=
d I
> can take a look as well).
>  > Another question is: can I use a 1D texture as a 3D texture for
> volumizer?
>  I am not sure what you mean by this, but I am guessing that you are
> trying to use a 1D texture as a vzParameterVolumeTexture? The minimal
> texture dimemsions that Volumizer supports is 4 currently, so if you use
> specify a texture with dimensions [n, 1, 1], Volumizer will zero pad it t=
o
> [n, 4, 4] and then render it. However, this code path can sometimes be a
> little buggy so the best option would be for you to simply create a
> texture of size [n, 4, 4] before passing to Volumizer. A simple strategy =
for
> computing the new texture would be to replicate the 1D texture over the
> complete data. Hope that makes sense.
>  I think that OMP should now support ARB_fragment_program extensions on
> Prism, but I honestly haven't tried this myself. Please give it a shot an=
d
> if something does not work, let me know and pass the info along to the OM=
P
> team.
>  Cheers,
> Praveen
>
>  -----Original Message-----
> *From:* owner-info-volumizer@els.sgi.com [mailto:
> owner-info-volumizer@els.sgi.com] *On Behalf Of *Kevin Wang
> *Sent:* Thursday, October 20, 2005 1:22 AM
> *To:* info-volumizer@els.sgi.com; praveenb@sgi.com
> *Subject:* Re: [info-volumizer] Multiple Transfer functions for volumizer
>
> Hi Praveen,
>
> Thanks for your prompt response. I am experimenting it using
> ARB_fragment_shader extension now. For one volume using one LUT it works
> with my vtkVolumizerTextureMapper class. But once I add one more volume, =
it
> says "Linking GLSL program failed".
>
> here is my code for second volume as a texture for tagging.
>
> unsigned char * pointer2 =3D new unsigned char[dims2[0]*dims2[1]*dims2[2]=
];
>
> ... here to initialize the volume
>
> // Create the volume texture
> vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture
> (dims, pointer2, textureType, format); //uses volume1' dims, textureType
> and format
>
> texture2->setGeometryROI(geometryROI); // volume1's geometry roi
>
> // Set the "volume" parameter for the appearance
> appearance->setParameter("volume2", texture2);
> texture2->unref();
>
> then I get the following error when running it:
>
> Volumizer (4): Compile status: 1
> Volumizer (4): Info Log:
> Volumizer (4): Link status: 0
> Volumizer (4): Info Log: Fragment info
> -------------
> (9) : error C3001: no program defined
>
> Volumizer Warning:
> Linking GLSL program 1 failed
>
> In my fragment program, i didnot use the second volume:
> static char FragmentShader[] =3D
> "void main(){\n"
> "vec4 color,color2,color3,color4;\n"
> "color =3D texture3D(volume,volume_TexCoord.stp);\n"
> "color4 =3D texture1D(lookup_table,color.x);\n"
> "gl_FragColor =3D color4;\n"
> "}";
>
> Do you have any idea that can help me identify the problem?
>
> Another question is: can I use a 1D texture as a 3D texture for volumizer=
?
>
>
> Lastly I would like to know if it is ok to ran this kind of program (i.e.
> opengl + fragment_program ) under OpenGL Multipipe environment? We have a
> custom developed volume rendering program which uses fragment_program. I
> wonder if the OMP can help improve the performance.
>
> Thanks a lot,
>
> -- Kevin
>
> On 10/18/05, Praveen Bhaniramka <praveenb@sgi.com> wrote:
> >
> > Hi Kevin,
> >
> > Using multiple lookup tables with Volumizer is pretty trivial. For this
> > you need to -
> >
> > 1. Specify the lookup tables in the corresponding shape's appearance
> > using vzParameterLookupTable objects.
> > 2. Specify the shader (GPU program) that uses the multiple lookup table=
s
> > to do what you want them to do.
> >
> > On modern GPUs, lookup tables can be implemented using dependent textur=
e
> > lookups. If you are using the ARB_fragment_program extension to write
> > your shaders (GPU program), you will also need to provide callback
> > routines to bind these dependent textures on specific texture units.
> > However, if you are using the ARB_fragment_shader/ARB_shading_language
> > extensions (also known as the OpenGL Shading Language), the dependent
> > texture setup is done by Volumizer transparently. You simply need to us=
e
> > them in your shader. Support for OpenGL Shading Language is available
> > with Volumizer 2.9 release.
> >
> > The CustomShadeViewer example under
> > /usr/share/Volumizer2/src/apps/simple/tmRenderAction directory
> > demonstrates the use of multiple lookup tables. There are several
> > example shaders under /usr/share/Volumizer2/src/shaders to help you get
> > started with the shader part as well.
> >
> > Let us know if you have any further questions.
> >
> > Cheers,
> > Praveen
> >
> > > -----Original Message-----
> > > From: owner-info-volumizer@els.sgi.com
> > > [mailto:owner-info-volumizer@els.sgi.com] On Behalf Of Kevin Wang
> > > Sent: Tuesday, October 18, 2005 8:22 PM
> > > To: Praveen Bhaniramka
> > > Cc: info-volumizer@els.sgi.com
> > > Subject: [info-volumizer] Multiple Transfer functions for volumizer
> > >
> > >
> > > Hi Praveen and list,
> > >
> > > I would like to use multiple transfer functions for
> > > volumizer. From the
> > > volumizer guide, it shows that one can assign a lookup table
> > > for certain
> > > shaders (LUT, Gradient, etc.)
> > >
> > > My question is how to download 2 lookup table to GPU and how
> > > to access
> > > them if I use GPU programming in volumizer.
> > >
> > > I see the technique using dependent texture for texture
> > > lookup table in
> > > the guide. I am guessing that this is the way done for the
> > > Altix since it
> > > uses ATI GPU.
> > >
> > > Thanks in advance,
> > >
> > > -- Kevin
> > >
> >
> >
>

------=_Part_10337_6188013.1129842716375
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Praveen,<br>
<br>
Fortunately after I add second lookup table to the shader, the problem
goes way. I think the problem is related to the shader string. Although
I am not sure what it exactly is. <br>
<br>
Now I have another question. If I use a second volume as the tagging
volume as the TagShader does in Volumizer, if the second volume
dimensions are same as the first, then the volume shows up correctly.
but if my second volume dimensions are not same as the first, let say
the first is 128*128*128 and the second is 8*8*8, then the volume shows
up like subsampling using the second volume even though I did not use
any value from the texture sampling of volume2. <br>
<br>
The reason I want different dimension on second volume is that I want
to keep it small so I can dynamically change the tagging area and
download this volume to GPU. Otherwise the downloading will be a pain. <br>
<br>
below is the shader program, you can see that I do not use the result from =
the second volume:<br>
static char FragmentShader[] =3D <br>
&quot;void main(){\n&quot;<br>
&quot;vec4 color,color2,color3,color4,color5;\n&quot;<br>
&quot;color =3D texture3D(volume,volume_TexCoord.stp);\n&quot;<br>
&quot;color2 =3D texture3D(volume1,volume1_TexCoord.stp);\n&quot;<br>
&quot;color4 =3D texture1D(lookup_table,color.x);\n&quot;<br>
&quot;color5 =3D texture1D(lookup_table2,color2.x);\n&quot;<br>
&quot;gl_FragColor =3D color4;\n&quot;<br>
&quot;}&quot;;<br>
<br>
I also attached the pictures using full resolution and subsampled resultion=
 of second volume. <br>
<br>-- Kevin<br>
<br><div><span class=3D"gmail_quote">On 10/20/05, <b class=3D"gmail_sendern=
ame">Praveen Bhaniramka</b> &lt;<a href=3D"mailto:praveenb@sgi.com">praveen=
b@sgi.com</a>&gt; wrote:</span><blockquote class=3D"gmail_quote" style=3D"b=
order-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; paddin=
g-left: 1ex;">







<div><span><font face=3D"Arial" size=3D"4">Hi=20
Kevin,</font></span></div>
<div><span><font face=3D"Arial" size=3D"4"></font></span>&nbsp;</div>
<div><span><font face=3D"Arial" size=3D"4">It is not clear what=20
the issue is, but definitely&nbsp;it should be perfectly legal for&nbsp;you=
=20
to&nbsp;not use the parameter &quot;volume2&quot; in the shader. </font></s=
pan></div>
<div><span><font face=3D"Arial" size=3D"4"></font></span>&nbsp;</div>
<div><span><font face=3D"Arial" size=3D"4">Couple of quick=20
tests -</font></span></div>
<div><span><font face=3D"Arial" size=3D"4">1. Make sure that=20
the system supports GLSL - &quot;glxinfo | grep ARB_fragment_shader&quot; s=
hould show the=20
extension strings. </font></span></div>
<div><span><font face=3D"Arial" size=3D"4">2. &quot;setenv=20
VOLUMIZER_DEBUG_LEVEL 5&quot; before running the application. The shader st=
ring=20
that&nbsp;the application passes to Volumizer is manipulated a little bit=
=20
internally to make sure that the shader contains all the necessary paramete=
rs=20
for the operations. Please look at the string and see if it shows anything=
=20
obviously incorrect. (Feel free to send it my way and I can take a look as=
=20
well).</font></span></div><span class=3D"q">
<div><span><font face=3D"Arial" size=3D"4"></font></span>&nbsp;</div>
<div><span>&gt; Another question is: can I use a 1D=20
texture as a 3D texture for volumizer? </span></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div></span>
<div><span><span><font face=3D"Arial" size=3D"4">I am not sure what you mea=
n by this, but I am guessing that=20
you are trying to use a 1D texture as a vzParameterVolumeTexture? The minim=
al=20
texture dimemsions that Volumizer supports is 4 currently, so if you use sp=
ecify=20
a texture&nbsp;with dimensions&nbsp;[n, 1, 1], Volumizer will zero pad it t=
o [n,=20
4, 4] and then render it. However, this code path can sometimes be a little=
=20
buggy so the best optio</font></span></span><span><span><font face=3D"Arial=
" size=3D"4">n would be for you to simply=20
create a texture of size [n, 4, 4] before passing to Volumizer. A simple=20
strategy for computing the new texture would be to replicate the 1D=20
texture&nbsp;over the complete data. Hope that makes sense.=20
</font></span></span></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div>
<div><span><span><font face=3D"Arial" size=3D"4">I think that OMP should no=
w support ARB_fragment_program=20
extensions on Prism, but I honestly haven't tried this myself. Please give =
it a=20
shot and if something does not work, let me know and pass the info along to=
 the=20
OMP team. </font></span></span></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div>
<div><span><span><font face=3D"Arial" size=3D"4">Cheers,</font></span></spa=
n></div>
<div><span><span><font face=3D"Arial" size=3D"4">Praveen</font></span></spa=
n></div>
<div><span><span><font face=3D"Arial" size=3D"4"></font></span></span>&nbsp=
;</div>
<blockquote style=3D"border-left: 2px solid rgb(0, 0, 0); padding-left: 5px=
; margin-left: 5px; margin-right: 0px;">
  <div></div>
  <div align=3D"left" dir=3D"ltr" lang=3D"en-us"><font face=3D"Tahoma" size=
=3D"2"><span class=3D"q">-----Original Message-----<br><b>From:</b>=20
  <a href=3D"mailto:owner-info-volumizer@els.sgi.com" target=3D"_blank" onc=
lick=3D"return top.js.OpenExtLink(window,event,this)">owner-info-volumizer@=
els.sgi.com</a> [mailto:<a href=3D"mailto:owner-info-volumizer@els.sgi.com"=
 target=3D"_blank" onclick=3D"return top.js.OpenExtLink(window,event,this)"=
>
owner-info-volumizer@els.sgi.com</a>]=20
  <b>On Behalf Of </b>Kevin Wang<br></span><div><span class=3D"e" id=3D"q_1=
070d0187eee4e98_4"><b>Sent:</b> Thursday, October 20, 2005 1:22=20
  AM<br><b>To:</b> <a href=3D"mailto:info-volumizer@els.sgi.com" target=3D"=
_blank" onclick=3D"return top.js.OpenExtLink(window,event,this)">info-volum=
izer@els.sgi.com</a>;=20
  <a href=3D"mailto:praveenb@sgi.com" target=3D"_blank" onclick=3D"return t=
op.js.OpenExtLink(window,event,this)">praveenb@sgi.com</a><br><b>Subject:</=
b> Re: [info-volumizer] Multiple Transfer=20
  functions for volumizer<br><br></span></div></font></div><div><span class=
=3D"e" id=3D"q_1070d0187eee4e98_6">Hi Praveen,<br><br>Thanks for your=20
  prompt response. I am experimenting it using ARB_fragment_shader extensio=
n=20
  now. For one volume using one LUT it works with my vtkVolumizerTextureMap=
per=20
  class. But once I add one more volume, it says &quot;Linking GLSL program=
=20
  failed&quot;.<br><br>here is my code for second volume as a texture for=
=20
  tagging.<br><br>&nbsp; unsigned char * pointer2 =3D new unsigned=20
  char[dims2[0]*dims2[1]*dims2[2]];<br>&nbsp; <br>&nbsp; ... here to initia=
lize=20
  the volume<br><br>&nbsp; // Create the volume texture<br>&nbsp;=20
  vzParameterVolumeTexture *texture2 =3D new vzParameterVolumeTexture=20
  <br>&nbsp;&nbsp;&nbsp; (dims, pointer2, textureType, format); //uses volu=
me1'=20
  dims, textureType and format <br>&nbsp; <br>&nbsp;=20
  texture2-&gt;setGeometryROI(geometryROI); // volume1's geometry roi<br>&n=
bsp;=20
  <br>&nbsp; // Set the &quot;volume&quot; parameter for the appearance<br>=
&nbsp;=20
  appearance-&gt;setParameter(&quot;volume2&quot;, texture2);<br>&nbsp;=20
  texture2-&gt;unref();<br><br>then I get the following error when running=
=20
  it:<br><br>Volumizer (4): Compile status: 1<br>Volumizer (4): Info=20
  Log:<br>Volumizer (4): Link status: 0<br>Volumizer (4): Info Log: Fragmen=
t=20
  info<br>-------------<br>(9) : error C3001: no program=20
  defined<br><br>Volumizer Warning:<br>Linking GLSL program 1 failed<br><br=
>In=20
  my fragment program, i didnot use the second volume:<br>static char=20
  FragmentShader[] =3D <br>&quot;void main(){\n&quot;<br>&quot;vec4=20
  color,color2,color3,color4;\n&quot;<br>&quot;color =3D=20
  texture3D(volume,volume_TexCoord.stp);\n&quot;<br>&quot;color4 =3D=20
  texture1D(lookup_table,color.x);\n&quot;<br>&quot;gl_FragColor =3D=20
  color4;\n&quot;<br>&quot;}&quot;;<br><br>Do you have any idea that can he=
lp me identify the=20
  problem? <br><br>Another question is: can I use a 1D texture as a 3D text=
ure=20
  for volumizer? <br><br>Lastly I would like to know if it is ok to ran thi=
s=20
  kind of program (i.e. opengl + fragment_program ) under OpenGL Multipipe=
=20
  environment? We have a custom developed volume rendering program which us=
es=20
  fragment_program. I wonder if the OMP can help improve the=20
  performance.<br><br>Thanks a lot,<br><br>-- Kevin<br><br>
  <div><span class=3D"gmail_quote">On 10/18/05, <b class=3D"gmail_sendernam=
e">Praveen=20
  Bhaniramka</b> &lt;<a href=3D"mailto:praveenb@sgi.com" target=3D"_blank" =
onclick=3D"return top.js.OpenExtLink(window,event,this)">praveenb@sgi.com</=
a>&gt;=20
  wrote:</span>
  <blockquote class=3D"gmail_quote" style=3D"border-left: 1px solid rgb(204=
, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi=20
    Kevin,<br><br>Using multiple lookup tables with Volumizer is pretty tri=
vial.=20
    For this<br>you need to -<br><br>1. Specify the lookup tables in the=20
    corresponding shape's appearance<br>using vzParameterLookupTable object=
s.=20
    <br>2. Specify the shader (GPU program) that uses the multiple lookup=
=20
    tables<br>to do what you want them to do.<br><br>On modern GPUs, lookup=
=20
    tables can be implemented using dependent texture<br>lookups. If you ar=
e=20
    using the ARB_fragment_program extension to write <br>your shaders (GPU=
=20
    program), you will also need to provide callback<br>routines to bind th=
ese=20
    dependent textures on specific texture units.<br>However, if you are us=
ing=20
    the ARB_fragment_shader/ARB_shading_language<br>extensions (also known =
as=20
    the OpenGL Shading Language), the dependent <br>texture setup is done b=
y=20
    Volumizer transparently. You simply need to use<br>them in your shader.=
=20
    Support for OpenGL Shading Language is available<br>with Volumizer 2.9=
=20
    release.<br><br>The CustomShadeViewer example under=20
    <br>/usr/share/Volumizer2/src/apps/simple/tmRenderAction=20
    directory<br>demonstrates the use of multiple lookup tables. There are=
=20
    several<br>example shaders under /usr/share/Volumizer2/src/shaders to h=
elp=20
    you get<br>started with the shader part as well. <br><br>Let us know if=
 you=20
    have any further questions.<br><br>Cheers,<br>Praveen<br><br>&gt;=20
    -----Original Message-----<br>&gt; From: <a href=3D"mailto:owner-info-v=
olumizer@els.sgi.com" target=3D"_blank" onclick=3D"return top.js.OpenExtLin=
k(window,event,this)">owner-info-volumizer@els.sgi.com</a><br>&gt;=20
    [mailto:<a href=3D"mailto:owner-info-volumizer@els.sgi.com" target=3D"_=
blank" onclick=3D"return top.js.OpenExtLink(window,event,this)">owner-info-=
volumizer@els.sgi.com</a>]=20
    On Behalf Of Kevin Wang<br>&gt; Sent: Tuesday, October 18, 2005 8:22=20
    PM<br>&gt; To: Praveen Bhaniramka<br>&gt; Cc: <a href=3D"mailto:info-vo=
lumizer@els.sgi.com" target=3D"_blank" onclick=3D"return top.js.OpenExtLink=
(window,event,this)">info-volumizer@els.sgi.com</a><br>&gt;=20
    Subject: [info-volumizer] Multiple Transfer functions for=20
    volumizer<br>&gt;<br>&gt;<br>&gt; Hi Praveen and list,<br>&gt;<br>&gt; =
I=20
    would like to use multiple transfer functions for<br>&gt; volumizer. Fr=
om=20
    the<br>&gt; volumizer guide, it shows that one can assign a lookup=20
    table<br>&gt; for certain<br>&gt; shaders (LUT, Gradient,=20
    etc.)<br>&gt;<br>&gt; My question is how to download 2 lookup table to =
GPU=20
    and how <br>&gt; to access<br>&gt; them if I use GPU programming in=20
    volumizer.<br>&gt;<br>&gt; I see the technique using dependent texture =
for=20
    texture<br>&gt; lookup table in<br>&gt; the guide. I am guessing that t=
his=20
    is the way done for the <br>&gt; Altix since it<br>&gt; uses ATI=20
    GPU.<br>&gt;<br>&gt; Thanks in advance,<br>&gt;<br>&gt; --=20
    Kevin<br>&gt;<br><br></blockquote></div><br></span></div></blockquote>

</blockquote></div><br>

------=_Part_10337_6188013.1129842716375--

------=_Part_10336_32850051.1129842716375
Content-Type: image/png; name=fullresolution.png
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="fullresolution.png"

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
+U7yK1uFKonXhOh6zZO4uC