NVidia's Vertex Array Range

Ou "Comment stoquer les triangles dans la mémoire de la carte graphique pour ne pas avoir à les lui renvoyer à chaque image".

Vous devez savoir utiliser les VA (Vertex Arrays) car les VAR sont une extension aux VAs.

La seule différence est la méthode d'allocation de la mémoire: au lieu d'utiliser malloc ou new, vous allez demander à votre carte graphique de vous donner un peu de mémoire AGP. Vous n'allouez qu'UN SEUL bloc de mémoire, dans lequel vous copierez ensuite une seule fois les tableaux de triangles.

Allocation d'un gros morceau de mémoire AGP:

//First, if you're under Windows, get the pointer to the needed functions using wglGetProcAddress

//Allocate memory
char var = strstr(extensions,"GL_NV_vertex_array_range")!=NULL;
if (!var) {
	printf("No VAR extension found\n");
	return;
}
char var2 = strstr(extensions,"GL_NV_vertex_array_range2")!=NULL;
	printf("VAR2 extension was found\n");

unsigned char *var_memory = AllocateMemoryNV( s, 0.0f,0.0f,0.5f );

if (var_memory==NULL)
	printf("AGP memory allocation failure\n");
else {
	size_var_free = s;
	VertexArrayRangeNV( s,var_memory );
	if (var2) {
		glEnableClientState( GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV );
		var_version = 2;
	}
	else {
		glEnableClientState( GL_VERTEX_ARRAY_RANGE_NV );
		var_version = 1;
	}
	printf("Memoire AGP allouee\n");
}
next_va_available = var_memory;

Allocation d'un VA dans le VAR:

//If no VAR is available, standard allocation method. CARE: don't forget to free that later
if (var==0 || var_memory==NULL || size>size_var_free )
	return malloc(size);

size_var_free -= size;
void *res = next_va_available;
next_va_available += size;
return res;
Quand vous fermez votre moteur 3D, libérez la mémoire AGP:
glDisableClientState( GL_VERTEX_ARRAY_RANGE_NV );
FreeMemoryNV( var_memory );

Main page

email : Sly