Shader doesnt work

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 = time40.0;
float d,e,f,g=1.0/40.0,h,i,r,q;
e=400.0
(p.x0.5+0.5);
f=400.0
(p.y0.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(eg)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=(rsin(q))-a/2.0;
d=sin(e
g)176.0+sin(eg)164.0+r;
h=((f+d)+a/2.0)g;
i=cos(h+r
p.x/1.3)
(e+e+a)+cos(qg6.0)(r+h/3.0);
h=sin(f
g)144.0-sin(eg)212.0p.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.0sin(q-(r
4.3+a/12.0)g)+tan(rg+h)184.0cos(rg+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
d8.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)dp.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?

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)?

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;

The result should look like this.

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

void main(void)
{
gl_FragColor = gl_Color;
}

My guess is that you are not passing the uniforms correctly:
http://www.opengl.org/wiki/GLSL_:_common_mistakes

I agree to what BionicBytes says here. Pass the uniforms as floats like this,


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

void main(void)
{
vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
float a = time40.0;
float d,e,f,g=1.0/40.0,h,i,r,q;
e=400.0
(p.x0.5+0.5);
f=400.0
(p.y0.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(eg)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=(rsin(q))-a/2.0;
d=sin(e
g)176.0+sin(eg)164.0+r;
h=((f+d)+a/2.0)g;
i=cos(h+r
p.x/1.3)
(e+e+a)+cos(qg6.0)(r+h/3.0);
h=sin(f
g)144.0-sin(eg)212.0p.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.0sin(q-(r
4.3+a/12.0)g)+tan(rg+h)184.0cos(rg+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
d8.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)dp.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?

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.”

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.

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.

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.