CG VERTEX SHADER ARRAY

Started by
5 comments, last by Dave Eberly 16 years, 11 months ago
Hello, I'm a newbie with shaders. I would need an array of varying input per vertex, in particular 16 coefficients for Spherical Harmonics... the code would be like this: //////////////////////////////////////////////////////////////// struct app2vertex { float4 f4Position : POSITION; float3 f4Color : COLOR; float vfTransfer [16] : BLENDWEIGHT; }; struct vertex2fragment { float4 f4ProjPos : POSITION; float4 f4Color : COLOR; }; vertex2fragment dotproduct( app2vertex IN, uniform float vfLight[16], uniform float4x4 mxModelViewProj ) { vertex2fragment OUT; OUT.f4ProjPos = mul(mxModelViewProj, IN.f4Position); OUT.f4Color = float4(0.0f, 0.0f, 0.0f, 1.0f); float shad = 0; for (int i = 0; i < 16; i++) { shad = IN.vfTransfer * vfLight; OUT.f4Color.r += shad; OUT.f4Color.g += shad; OUT.f4Color.b += shad; } return OUT; } ///////////////////////////////////////////////////// In particular the input stuff sounds like: struct app2vertex { float4 f4Position : POSITION; float3 f4Color : COLOR; float vfTransfer [16] : ??whatHere??; }; Anyway, the CGC compiler seems to compile this stuff, but the question is: Has it a sense? If yes how could I pass the vector in OPENGL to the shader? If no, how could I have 16 coefficients per vertex to use in a dot product with the uniform parameter? THANKS A LOT, IF THE QUESTION IS NOT CLEAR, PLEASE DON'T IGNORE THE POST, ASK ME TO BE CLEARER.. Cheers
Advertisement
Quote:Original post by Emanuele Russo
Anyway, the CGC compiler seems to compile this stuff, but the question is:
Has it a sense?
If yes how could I pass the vector in OPENGL to the shader?

If no, how could I have 16 coefficients per vertex to use in a dot product with the uniform parameter?


The problem comes down to how OpenGL handles "semantics" such as BLENDWEIGHT. If you are running OpenGL 2.0, no problem. You can use vertex attribute support. If you are running OpenGL 1.5 or earlier, it is not clear whether you can use OpenGL directly. I had posted something similar to this (to comp.graphics.api.opengl) about setting the source for tangent vectors when you do not have OpenGL 2.0, you do not have the GL_EXT_coordinate_frame extension available, and you do not use the Cg Runtime. No answer to that post...

With Cg Runtime, you can use cgGLSetParameterPointer to set the data source. The CGparameter input to this function is a handle you obtain by querying with functions such as cgGetEffectParameterBySemantic or cgGetNamedProgramParameter.

If you avoid the BLENDWEIGHT semantic, you can use TEXCOORD channels so that OpenGL 1.5 or earlier can do what you want. The following would work:

struct app2vertex
{
float4 f4Position : POSITION;
float3 f4Color : COLOR;
float4 vfTransfer0 : TEXCOORD0; // your vfTransfer[0..3]
float4 vfTransfer4 : TEXCOORD1; // your vfTransfer[4..7]
float4 vfTransfer8 : TEXCOORD2; // your vfTransfer[8..11]
float4 vfTransfer12 : TEXCOORD3; // your vfTransfer[12..15]
};

Hi, thank you for your hints,

Actually I program with openGL 2.0, but I tried with the array

float vfTransfer [16] : BLENDWEIGHT;

loading with the

glWeightPointerARB(16, bla bla)

but gives the ENUM error for the 16.

After I tried as you suggested, with the 4 textcoord, and seems to work.
I'll post another time to say if it really works, now I've another stupid question...

I've to draw 2 geometries, a sphere and a box and I do it this way:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
for(std::size_t i=0; i<2; ++i)
{
SH_OBJECT * currentObject=shScene.objects;


glVertexPointer(3, GL_FLOAT, sizeof(SH_VERTEX), &currentObject->vertices[0].position);
glColorPointer(4,GL_FLOAT, sizeof(SH_VERTEX), &currentObject->vertices[0].diffuseMaterial);

//HERE I WILL PUT TEXTCOORD

glDrawElements( GL_TRIANGLES, currentObject->indices.size(), GL_UNSIGNED_INT,
&currentObject->indices[0]);
checkForCgError("disabling vertex profile");

}

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

But it renders only the second! Probably it doesn't know the depth... what should I enable, or do to see both?

thanks
Emanuele
Another annoying problem...

now I try to pass double in place of float. It seems not to work.

I declared the
uniform double vFligth[16];

try to load with
cgSetParameterArray1d(blabla);

CG ERROR: The parameter is not of a numeric type.

isnt'it strange? For me it is, I hope it is not for you!
Is a type support problem?

Thanks
Emanuele
Quote:Original post by Emanuele Russo
glWeightPointerARB(16, bla bla)

but gives the ENUM error for the 16.


This extension function requires that the first input (the number of weights per vertex) be 1, unless somehow your drivers support more than 1. You can query to find out how large this number can be.
GLint maxVertexUnits;
glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &maxVertexUnits);

You mention you are using OpenGL. Skip the extension glWeightPointerARB and use instead glVertexAttribPointer.

Quote:
I've to draw 2 geometries, a sphere and a box and I do it this way:


There is a lot of OpenGL state you have not mentioned, so it is difficult to say why you do not see what is expected. It is just as difficult to suggest what you should do.

Quote:
now I try to pass double in place of float. It seems not to work.

I declared the
uniform double vFligth[16];

try to load with
cgSetParameterArray1d(blabla);

CG ERROR: The parameter is not of a numeric type.

isnt'it strange? For me it is, I hope it is not for you!
Is a type support problem?


This is not strange at all. The graphics hardware does not support double precision input arrays.
Ok then, everything solved.
Passing the 4 float4 texCoord it worked perfectly... and now I see both geometries, is was just a stupid error.

I didn't know about double precision exx... forgive my ignorance.

Now all I have to do is to insert this stuff into Wild Magic...

I didn't notice that you were Dave Eberly... if you write on this forum, then I can stop boring you by email!

Well, thank you again!
Regards, Emanuele
Quote:Original post by Emanuele Russo
Ok then, everything solved.
Passing the 4 float4 texCoord it worked perfectly... and now I see both geometries, is was just a stupid error.

I didn't know about double precision exx... forgive my ignorance.

Now all I have to do is to insert this stuff into Wild Magic...

I didn't notice that you were Dave Eberly... if you write on this forum, then I can stop boring you by email!



I already responded by email that my parser happens to handle arrays of uniforms, and I posted an example at my 3DGED3 book correction page. So all that you are currently doing should work in Wild Magic.

Regarding posting here about Wild Magic, please communicate instead by email. Folks here are interested in SDL, Ogre, and other packages. It is better not to "borrow" this forum for obtaining my technical support :)

This topic is closed to new replies.

Advertisement