No way to get into programming shaders with *older* graphic-card?

Started by
9 comments, last by zedz 16 years, 3 months ago
I hope I won't be ridiculed for admitting I still use a NVidia GeForce 4 TI in my computer (Hell, it used to be top-of-the-line back in the day... six years ago)... ;) Now, I want to get started with shader-programming. I'm using C++/SDL/OpenGL so far and I've decided to start out with GLSL for now. However, when I use the following code to check whether my GeFore 4 TI supports the vertex- and fragment-shader-extensions, it says both aren't:

bool check_extension ( char* name )
// checks whether an extension is supported
{
	char*	list;

	// get a list of supported extensions
	list = ( char* ) glGetString ( GL_EXTENSIONS );

	if ( !name || !list )
	// if something is wrong
		return false;

	while ( *list )
	// loop through list
	{
		// find the length of the first extension substring
		unsigned int first_extension_length = strcspn ( list, " " );

		if ( strlen ( name ) == first_extension_length && strncmp ( name, list, first_extension_length ) == 0 )
		// if extension is supported
			return true;

		// move to the next substring
		list += first_extension_length + 1;
	}

	return false;
}

void init_extensions ( )
// initializes extensions
{
	if ( !check_extension ( "GL_ARB_multitexture" ) )
		return_error ( fatal_error, "Failed to load GL_ARB_multitexture extension. Your system doesn't support it." );

	if ( !check_extension ( "GL_ARB_vertex_shader" ) )
		return_error ( fatal_error, "Failed to load GL_ARB_vertex_shader extension. Your system doesn't support it." );

	if ( !check_extension ( "GL_ARB_fragment_shader" ) )
		return_error ( fatal_error, "Failed to load GL_ARB_fragment_shader extension. Your system doesn't support it." );
}

As you can see, I also load the multitexture-extension just to check my code and this one loads perfectly fine. Now, I don't trust this test-result, because games such as Half-Life 2, FEAR, all parts of Splinter Cell and Far Cry all run stable on my computer and - if I'm not mistaken - all those do use shaders in one place or the other (HL2 with the blooming for example). So, what am I doing wrong? Will I have to use CG as a language (because it's made by NVidia)? Is it possible that one language works and the other doesn't? Any help is appreciated.
Advertisement
You can use GLview to determine the capabilities of your video card.
GLView says that the GeForce 4 TI doesn't support ARB_vertex_shader and ARB_fragment shader either. But how do the other shaders run on my machine? Would CG work when GLSL doesn't?
Although not what you want, this might interest you.
AFAIK on my old GF4 vertex shaders with GLSL worked. This may depend on the actual driver you use. For initializing extensions and checking their availability I recommend you use a tool such as GLEW. This makes things a lot easier. I believe the framebuffer object extension was also introduced in one driver release (or beta driver) for GF4 but I don't know whether they removed it later on, as it was buggy.

You could use CG as a shader programming language since it can also target other Nvidia specific shader extensions such as NV_fragment_shader and thus you would be able to create some hardware accelerated shaders on GF4, but you would be very much limited in what you can achive...

Another alternative would be to use Mesa, which has a GLSL compiler and is OpenGL 2.0 or 2.1. Sure it does software rendering and therefore things will be horribly slow but you could at least test GLSL.
OpenGL GLSL requires a higher version of pixel shader (~1.3?) than entry level directx shader, thats why you will be able to run games that require basic directx shaders. You can emulate GLSL in software with http://developer.nvidia.com/object/nvemulate.html
Vertex shaders can be emulated on the CPU, and so if you get up to date drivers then you might find you're able to run GLSL vertex shaders even though your card doesn't support them. You're out of luck for GLSL pixel shaders though.

You can use Cg for pixel shaders though (becuase the GF4 supports pixel shader 1.3, but not 2.0 which is needed for GLSL support). You'll have various restrictions though (like the number of textures you can read and the length of the shader etc.). It will probably be easier to use Cg for both pixel and vertex shaders.
Okay, so I can either run GLSL, but only use the vertex-shader, or I can use CG with limited options?

Hmm... I'd really rather stick to using GLSL than CG with OpenGL, but in this case I guess I'll change language.

I downloaded NVemulate, but it doesn't seem to work. I change the feature-set-emulation and the GLSL-compiler-device-support and hit "apply" but it doesn't allow my program to use the extensions either. I suppose that's not what the tool does? Or am I using it wrong?

Thanks for the information, guys.
Quote:Original post by d h k
Hmm... I'd really rather stick to using GLSL than CG with OpenGL, but in this case I guess I'll change language.

If you know GLSL then it'll be a snap to pick up Cg, since all the concepts are the same and the syntax is pretty close too.
Ok. Thanks everyone. I switched to CG and after, like, three hours I came up with my first shader: it's bump-mapping! :)



Yay for entering a new level of 3d-programming. Cheers!

This topic is closed to new replies.

Advertisement