Rbraz,
heres some example code for you. Its more or less the best I can do :-(. Size, crinkler flags etc in code...let me know what you get. It will be a good test of VC++ v hand coding.
For others, this is the smallest oldskool tunnel effect I can do in shaders. Its pretty small (the shader). IF ati drivers didnt break without a vertex shader I could do better. Oh well.
// Chris Thornborrow (auld)
// New crinkler optimised OpenGL 1k + shader framework.
// Sets screen size, loads vertex and fragment shader
// also exitProcess for some Nvidia and Vista machines
// Example shader included...
// /CRINKLER /COMPMODE:SLOW /HASHSIZE:200 /HASHTRIES:50 /ORDERTRIES:6000
// 915 bytes with VC++ Express
// Oldskool tunnel effect...but without real timer
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "glext.h"
///////////////////////////////////////////////////////////////////
// WINDOWING
#define SCREENX 1024
#define SCREENY 768
static PIXELFORMATDESCRIPTOR pfd={
0, // Size Of This Pixel Format Descriptor... BAD coding, nothing new, saves 6 bytes
1, PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 32, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0
};
static DEVMODE dmScreenSettings={
"",0,0,sizeof(dmScreenSettings),0,DM_PELSWIDTH|DM_PELSHEIGHT,
0,0,0,0,0,0,0,0,0,0,0,0,0,"",0,0,SCREENX,SCREENY,0,0,0,0,0,0,0,0,0,0
};
const char *vsh="varying vec4 v;void main(){v=ftransform();gl_Position=gl_Vertex;}";
const char *fsh="varying vec4 v;void main(){float t=length(v.xy);gl_FragColor=vec4(cos(4./t+v.z)*t);}";
void setShader() {
GLuint p,s;
p = ((PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"))();
s = ((PFNGLCREATESHADERPROC)(wglGetProcAddress("glCreateShader")))(GL_VERTEX_SHADER);
((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource")) (s, 1, &vsh, NULL);
((PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"))(s);
((PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader")) (p,s);
s = ((PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"))(GL_FRAGMENT_SHADER);
((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource")) (s, 1, &fsh, NULL);
((PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"))(s);
((PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader")) (p,s);
((PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"))(p);
((PFNGLUSEPROGRAMPROC) wglGetProcAddress("glUseProgram"))(p);
}
void WINAPI WinMainCRTStartup()
{
ChangeDisplaySettings (&dmScreenSettings,CDS_FULLSCREEN);
HDC hDC = GetDC( CreateWindow("edit", 0, WS_POPUP|WS_VISIBLE|WS_MAXIMIZE, 0, 0, 0, 0, 0, 0, 0, 0) );
SetPixelFormat ( hDC, ChoosePixelFormat ( hDC, &pfd) , &pfd );
wglMakeCurrent ( hDC, wglCreateContext(hDC) );
ShowCursor(FALSE);
setShader();
do {
glTranslatef(0,0,0.5f);
glRects(-1,-1,1,1);
SwapBuffers(hDC);
} while ( !GetAsyncKeyState(VK_ESCAPE) );
ExitProcess(0);
}