OpenGL pixel shader: Difference between revisions

+C
No edit summary
(+C)
Line 8:
 
See also: [http://www.opengl.org/documentation/glsl/ opengl.org's gl shader language documentation], and [http://www.lighthouse3d.com/tutorials/glsl-tutorial/ lighthouse3d.com's glsl tutorial].
=={{header|C}}==
Getting a true (pseudo) random number is surprisingly tricky. The following code makes something noisy, but not at all random:
<lang c>#include <stdio.h>
#include <GL/glew.h>
#include <GL/glut.h>
 
float angle = 0;
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT);
 
glLoadIdentity();
glRotatef(angle, .3, 1, 0);
glBegin(GL_TRIANGLES);
glVertex3f(-.5, -.5, 0);
glVertex3f(0, .5, 0);
glVertex3f(.5, 0, 0);
glEnd();
angle += .01;
glutSwapBuffers();
}
 
void set_shader()
{
GLuint ps, vs, prog;
const char *f =
"varying float x, y, z;"
"float rand(float s) { return mod(abs(s) * 7654321 + 1, 1); }"
"void main() { gl_FragColor = vec4(rand(x), rand(y), rand(z), 1); }";
const char *v =
"varying float x, y, z;"
"void main() {"
" gl_Position = ftransform();"
" x = gl_Position.x; y = gl_Position.y; z = gl_Position.z;"
" x *= z; y *= x; z += (x + y);"
"}";
 
vs = glCreateShader(GL_VERTEX_SHADER);
ps = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(ps, 1, &f, 0);
glShaderSource(vs, 1, &v, 0);
 
glCompileShader(vs);
glCompileShader(ps);
 
prog = glCreateProgram();
glAttachShader(prog, ps);
glAttachShader(prog, vs);
 
glLinkProgram(prog);
glUseProgram(prog);
}
 
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(200, 200);
glutCreateWindow("Stuff");
glutIdleFunc(render);
 
glewInit();
if (!glewIsSupported("GL_VERSION_2_0")) {
fprintf(stderr, "GL 2.0 unsupported\n");
exit(1);
}
 
set_shader();
glutMainLoop();
 
return 0;
}</lang>
Anonymous user