… program takes fourth element of the table A and works properly - is OK.
But as I do:
idx = 3;
value = A[idx];
program takes first element (like in idx=0).
Is it possible to indexing tables by variable? How to do it? What I need to add or configure in OpenGL environment? I use 2.16 version of OpenGL, and a card ATI Radeon HD 3870.
Well it is possible and it should work the way you pointed it out ,but in ATI’s world this problem could be possible. Make shure you have the latest drives. Or use a nvidia card xD
Maybe you can post the shader, it can be related to an other problem. I can remember that indexing worked for me that way on ati cards.
If it can reassure you, on my ATI Radeon X1600 mobility, it is clearly impossible to index arrays with variables: compiler error (with the latest linux ATI driver). Only static indexing is supported on array of primitives types like int. This is completly useless, Thank you ATI!
i dont think there is any hardware now thats supports indexing into at shader runtime generated arrays.
but compilers can still “emulate” indexing (i think the dx hlsl-compiler does) by using alot of compares/conditional assignments linear to your array size, so i.e. expect for indexing into a 10-element array about 20 shaderinstructions.
so a
y=a[x];
will be expanded to
if(x==0) y=a[0];
if(x==1) y=a[1];
if(x==2) y=a[2];
…
if(x==9) y=a[9];
this is because shaders dont have any read-write data storage except registers, and i dont know of any hardware that can index into registerspace.
indexing into uniform arrays works on newer hardware.
I tried to index by variable arrays that are not uniform in a fragment shader on a Geforce 8800 GTS and it works perfectly and fast.
I can’t find the usability of such arrays that can only be indexed by constant expressions…
The GF8 uses unified shaders, so the fragment shaders uses the same hardware like the vertex shader. On GF7 and earlier the fragment shaders were not be be able to do that. As long the all indices are known at compile time (i.E. by unrolling loops) it should work too. If it doesn’t work on the HD 3870, it may be that the drivers are still broken.