PDA

View Full Version : Shader doesnt work



Mountainking
08-28-2011, 04:13 PM
Hi, i want this shader to get working on my desktop PC but had no success.

#ifdef GL_ES
precision highp float;
#endif

uniform vec2 resolution;
uniform float time;

void main(void)
{
vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
float a = time*40.0;
float d,e,f,g=1.0/40.0,h,i,r,q;
e=400.0*(p.x*0.5+0.5);
f=400.0*(p.y*0.5+0.5);
i=200.0+sin(e*g+a/150.0)*20.0;
d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0;
r=sqrt(pow(i-e,2.0)+pow(d-f,2.0));
q=f/r;
e=(r*cos(q))-a/2.0;f=(r*sin(q))-a/2.0;
d=sin(e*g)*176.0+sin(e*g)*164.0+r;
h=((f+d)+a/2.0)*g;
i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0);
h=sin(f*g)*144.0-sin(e*g)*212.0*p.x;
h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g;
i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h);
i=mod(i/5.6,256.0)/64.0;
if(i<0.0) i+=4.0;
if(i>=2.0) i=4.0-i;
d=r/350.0;
d+=sin(d*d*8.0)*0.52;
f=(sin(a*g)+1.0)/2.0;
gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),1.0);
}
For my shader class i need an vertex- and fragment shader. so i used this vertexshader:

void main(void)
{
gl_Position = ftransform();
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
The function for rendering is like

void Draw(Point topLeft, Point bottomRight)
{
counter += 0.01;
if (counter > 360.0)
counter = 0;

int x = bottomRight.X() - topLeft.X();
int y = bottomRight.Y() - topLeft.Y();

glDisable(GL_CULL_FACE);

glColor4ub(rand()%255, rand()%255, rand()%255, 255);

shader.bind();
glUniform2d(shader_resolution, x, y);
glUniform1d(shaderr_time, counter);

glBegin(GL_TRIANGLES);
glVertex3d(topLeft.X(), topLeft.Y(), -10.0);
glVertex3d(topLeft.X(), bottomRight.Y(), -10.0);
glVertex3d(bottomRight.X(), topLeft.Y(), -10.0);

glVertex3d(topLeft.X(), bottomRight.Y(), -10.0);
glVertex3d(bottomRight.X(), bottomRight.Y(), -10.0);
glVertex3d(bottomRight.X(), topLeft.Y(), -10.0);
glEnd();

shader.unbind();
glEnable(GL_CULL_FACE);
}
Any idea why this gives me an black rectangle?

Alfonse Reinheart
08-28-2011, 06:33 PM
Possibly because it uses the worst, least intuitive variables names known to man.

Any guesses on what the shader is supposed to do? Have you confirmed that the triangle is on screen (by writing a solid color in the fragment shader)?

BionicBytes
08-29-2011, 03:18 AM
Why are you sending doubles as uniforms:


glUniform2d(shader_resolution, x, y);
glUniform1d(shaderr_time, counter);

when your shaders define them as floats?


uniform vec2 resolution;
uniform float time;

Mountainking
08-29-2011, 05:15 AM
Any guesses on what the shader is supposed to do? Have you confirmed that the triangle is on screen (by writing a solid color in the fragment shader)?
The result should look like this (http://www.iquilezles.org/apps/shadertoy/?p=monjori).

If i change the fragment shader to the following i get as supposed an filled rectangle.

void main(void)
{
gl_FragColor = gl_Color;
}

Onumis
09-23-2011, 07:45 AM
My guess is that you are not passing the uniforms correctly:
http://www.opengl.org/wiki/GLSL_:_common_mistakes

mobeen
09-24-2011, 07:52 PM
I agree to what BionicBytes says here. Pass the uniforms as floats like this,


glUniform2f(shader_resolution, x, y);
glUniform1f(shaderr_time, counter);

mhagain
09-26-2011, 04:37 AM
void main(void)
{
vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
float a = time*40.0;
float d,e,f,g=1.0/40.0,h,i,r,q;
e=400.0*(p.x*0.5+0.5);
f=400.0*(p.y*0.5+0.5);
i=200.0+sin(e*g+a/150.0)*20.0;
d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0;
r=sqrt(pow(i-e,2.0)+pow(d-f,2.0));
q=f/r;
e=(r*cos(q))-a/2.0;f=(r*sin(q))-a/2.0;
d=sin(e*g)*176.0+sin(e*g)*164.0+r;
h=((f+d)+a/2.0)*g;
i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0);
h=sin(f*g)*144.0-sin(e*g)*212.0*p.x;
h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g;
i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h);
i=mod(i/5.6,256.0)/64.0;
if(i<0.0) i+=4.0;
if(i>=2.0) i=4.0-i;
d=r/350.0;
d+=sin(d*d*8.0)*0.52;
f=(sin(a*g)+1.0)/2.0;
gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),1.0);
}

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

My guess is that you've blown well past your instruction limit and are now sailing out merrily somewhere in the region of the Small Magellanic Cloud.

What kind of hardware are you trying to run this monstrosity on?

arekkusu
09-26-2011, 08:13 AM
GLSL does not have an instruction limit:

"A shader should not fail to compile, and a program object should not fail to link due to lack of instruction space or lack of temporary variables. Implementations should ensure that all valid shaders and program objects may be successfully compiled, linked and executed."

Alfonse Reinheart
09-26-2011, 12:44 PM
Yeah, like any implementation has ever allowed that. Please; that's one of the Ivory Tower ideals that 3D Labs put into the original GLSL proposal. And like virtually all of those ideals, it amounted to nothing.

Shaders can and will fail to compile/link due to lack of instructions or temporaries.

Xmas
09-28-2011, 02:41 AM
My guess is that you've blown well past your instruction limit and are now sailing out merrily somewhere in the region of the Small Magellanic Cloud.
That shader is horrible to read, but I don't think it's anywhere close to instruction or temp limits on any modern PC GPU. It will even "run" on many smartphones.