예제 #1
0
static void Init( void )
{
   /* borrowed from an nvidia demo:
    * c[0..3] = modelview matrix
    * c[4..7] = inverse modelview matrix
    * c[32] = light pos
    * c[35] = diffuse color
    */
   static const char prog[] = 
      "!!VP1.0\n"
      "#Simple transform and diffuse lighting\n"
      "\n"
      "DP4   o[HPOS].x, c[0], v[OPOS] ;	# object x MVP -> clip\n"
      "DP4   o[HPOS].y, c[1], v[OPOS] ;\n"
      "DP4   o[HPOS].z, c[2], v[OPOS] ;\n"
      "DP4   o[HPOS].w, c[3], v[OPOS] ;\n"

      "DP3   R1.x, c[4], v[NRML] ;	# normal x MV-1T -> lighting normal\n"
      "DP3   R1.y, c[5], v[NRML] ;\n"
      "DP3   R1.z, c[6], v[NRML] ;\n"

      "DP3   R0, c[32], R1 ;  		# L.N\n"
      "MUL   o[COL0].xyz, R0, c[35] ;   # col = L.N * diffuse\n"
      "MOV   o[TEX0], v[TEX0];\n"
      "END";

   if (!glutExtensionSupported("GL_NV_vertex_program")) {
      printf("Sorry, this program requires GL_NV_vertex_program");
      exit(1);
   }

   glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 1,
                   strlen(prog), (const GLubyte *) prog);
   assert(glIsProgramNV(1));
   glBindProgramNV(GL_VERTEX_PROGRAM_NV, 1);

   /* Load the program registers */
   glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
   glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4, GL_MODELVIEW, GL_INVERSE_TRANSPOSE_NV);

   /* Light position */
   glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 32, 2, 2, 4, 1);
   /* Diffuse material color */
   glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 35, 0.25, 0, 0.25, 1);

   glEnable(GL_VERTEX_PROGRAM_NV);
   glEnable(GL_DEPTH_TEST);
   glClearColor(0.3, 0.3, 0.3, 1);

   printf("glGetError = %d\n", (int) glGetError());
}
예제 #2
0
//Set up openGL
bool GLInit()
{
	//set viewport
	int height;
	if (window.height==0)
		height=1;
	else
		height=window.height;
	
	glViewport(0, 0, window.width, height);					//reset viewport

	//set up projection matrix
	glMatrixMode(GL_PROJECTION);							//select projection matrix
	glLoadIdentity();										//reset
	gluPerspective(45.0f, (GLfloat)window.width/(GLfloat)height, 0.1f, 100.0f);
	
	//load identity modelview
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	//other states
	//shading
	glShadeModel(GL_SMOOTH);
	glClearColor(	backgroundColor.r,
					backgroundColor.g,
					backgroundColor.b,
					backgroundColor.a);
	glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

	//depth
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);

	//hints
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);


	//load vertex programs
	glGenProgramsNV(1, &chromaticSingleVP);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, chromaticSingleVP);
	LoadNV_vertex_program("chromatic single vp.txt", chromaticSingleVP);

	glGenProgramsNV(1, &simpleSingleVP);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, simpleSingleVP);
	LoadNV_vertex_program("simple single vp.txt", simpleSingleVP);

	glGenProgramsNV(1, &chromaticTwin1VP);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, chromaticTwin1VP);
	LoadNV_vertex_program("chromatic twin 1 vp.txt", chromaticTwin1VP);

	glGenProgramsNV(1, &chromaticTwin2VP);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, chromaticTwin2VP);
	LoadNV_vertex_program("chromatic twin 2 vp.txt", chromaticTwin2VP);




	//Set track matrices
	glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
	glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4, GL_MODELVIEW, GL_IDENTITY_NV);
	glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 8, GL_MODELVIEW, GL_INVERSE_TRANSPOSE_NV);
	glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 12, GL_TEXTURE, GL_IDENTITY_NV);

	//Send fresnel multipication factor to c[28]
	glProgramParameter4fNV(	GL_VERTEX_PROGRAM_NV, 28, fresnel, fresnel, fresnel, 1.0f);
	
	//Send refractive indices to c[32], c[33], c[34]
	glProgramParameter4fNV(	GL_VERTEX_PROGRAM_NV, 32, index, index*index, 0.0f, 1.0f);
	glProgramParameter4fNV(	GL_VERTEX_PROGRAM_NV, 33, index+indexDelta,
							(index+indexDelta)*(index+indexDelta), 0.0f, 1.0f);
	glProgramParameter4fNV(	GL_VERTEX_PROGRAM_NV, 34, index+2*indexDelta,
							(index+2*indexDelta)*(index+2*indexDelta), 0.0f, 1.0f);
	//Send useful constants to c[64]
	glProgramParameter4fNV(	GL_VERTEX_PROGRAM_NV, 64, 0.0f, 1.0f, 2.0f, 0.5f);



	//Init states to begin
	if(renderPath==CHROMATIC_SINGLE)
		InitChromaticSingleStates();

	if(renderPath==SIMPLE_SINGLE)
		InitSimpleSingleStates();
	
	return true;
}
예제 #3
0
//Set up openGL
bool GLInit()
{
    //set viewport
    int height;
    if (window.height==0)
        height=1;
    else
        height=window.height;

    glViewport(0, 0, window.width, height);					//reset viewport

    //set up projection matrix
    glMatrixMode(GL_PROJECTION);							//select projection matrix
    glLoadIdentity();										//reset
    gluPerspective(45.0f, (GLfloat)window.width/(GLfloat)height, 1.0f, 100.0f);

    //load identity modelview
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    //other states
    //shading
    glShadeModel(GL_SMOOTH);
    glClearColor(	backgroundColor.r,
                    backgroundColor.g,
                    backgroundColor.b,
                    backgroundColor.a);
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    //depth
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    //hints
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glEnable(GL_CULL_FACE);

    //set up sphere
    sphere=gluNewQuadric();

    //Set up vertex arrays for quad
    glVertexPointer(3, GL_FLOAT, 0, vertexPositions);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glEnable(GL_VERTEX_ARRAY);
    glEnable(GL_TEXTURE_COORD_ARRAY);

    //load vertex program
    glGenProgramsNV(1, &vertexProgram);
    glBindProgramNV(GL_VERTEX_PROGRAM_NV, vertexProgram);
    LoadNV_vertex_program("vertex program.txt", vertexProgram);

    //Set track matrices
    glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
    glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4, GL_TEXTURE0_ARB, GL_IDENTITY_NV);

    //Set texture atten states
    SetTextureAttenStates();

    return true;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglTrackMatrixNV(JNIEnv *env, jclass clazz, jint target, jint address, jint matrix, jint transform, jlong function_pointer) {
	glTrackMatrixNVPROC glTrackMatrixNV = (glTrackMatrixNVPROC)((intptr_t)function_pointer);
	glTrackMatrixNV(target, address, matrix, transform);
}
예제 #5
0
//Set up variables
bool DemoInit()
{
	//Seed random number generator	
	srand( (unsigned)time( NULL ) );

	//Initialise the array of vertices
	numVertices=gridDensity*gridDensity;
	vertices=new SIMPLE_VERTEX[numVertices];
	if(!vertices)
	{
		LOG::Instance()->OutputError("Unable to allocate space for %d vertices", numVertices);
		return false;
	}

	for(int i=0; i<gridDensity; ++i)
	{
		for(int j=0; j<gridDensity; ++j)
		{
			vertices[i*gridDensity+j].position.Set(	(float(i)/(gridDensity-1))*2-1,
													0.0f,
													(float(j)/(gridDensity-1))*2-1);
			
			vertices[i*gridDensity+j].normal.Set(	0.0f, 1.0f, 0.0f);
			
			vertices[i*gridDensity+j].texCoords.Set( (float(i)/(gridDensity-1)),
													-(float(j)/(gridDensity-1)));
		}
	}

	//Initialise the indices
	numIndices=2*(gridDensity)*(gridDensity-1);
	indices=new GLuint[numIndices];
	if(!indices)
	{
		LOG::Instance()->OutputError("Unable to allocate space for %d indices", numIndices);
		return false;
	}

	for(int i=0; i<gridDensity-1; ++i)
	{
		for(int j=0; j<gridDensity; ++j)
		{
			indices[(i*gridDensity+j)*2  ]=(i+1)*gridDensity+j;
			indices[(i*gridDensity+j)*2+1]=i*gridDensity+j;
		}
	}

	//Load texture
	IMAGE floorImage;
	floorImage.Load("OpenGL.tga");
	if(floorImage.paletted)
		floorImage.ExpandPalette();
	
	glGenTextures(1, &floorTexture);
	glBindTexture(GL_TEXTURE_2D, floorTexture);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

	gluBuild2DMipmaps(	GL_TEXTURE_2D, GL_RGBA8, floorImage.width, floorImage.height,
						floorImage.format, GL_UNSIGNED_BYTE, floorImage.data);

	//Initialise the lights
	for(int i=0; i<numLights; ++i)
	{
		lights[i].position.Set(	(float(rand())/RAND_MAX)*2-1,
								0.02f,
								(float(rand())/RAND_MAX)*2-1);
		lights[i].velocity.Set(	(float(rand())/RAND_MAX)*2-1,
								0.0f,
								(float(rand())/RAND_MAX)*2-1);
		lights[i].color.Set(	(float(rand())/RAND_MAX)*0.75f,
								(float(rand())/RAND_MAX)*0.75f,
								(float(rand())/RAND_MAX)*0.75f,
								1.0f);
	}

	//Load vertex programs
	if(GLEE_NV_vertex_program)
	{
		glGenProgramsNV(1, &vp1);
		glBindProgramNV(GL_VERTEX_PROGRAM_NV, vp1);
		LoadARB_program(GL_VERTEX_PROGRAM_NV, "vp1.txt");
	}

	if(GLEE_NV_vertex_program2)
	{
		glGenProgramsNV(1, &vp2);
		glBindProgramNV(GL_VERTEX_PROGRAM_NV, vp2);
		LoadARB_program(GL_VERTEX_PROGRAM_NV, "vp2.txt");
	}

	if(GLEE_NV_vertex_program || GLEE_NV_vertex_program2)
	{
		//Track modelview-projection matrix
		glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
	}

	//reset timer
	timer.Reset();

	return true;
}
예제 #6
0
static void Init( void )
{
   static const char *fragProgramText =
      "!!FP1.0\n"
      "DECLARE Diffuse; \n"
      "DECLARE Specular; \n"
      "DECLARE LightPos; \n"

      "# Compute normalized LightPos, put it in R0\n"
      "DP3 R0.x, LightPos, LightPos;\n"
      "RSQ R0.y, R0.x;\n"
      "MUL R0, LightPos, R0.y;\n"

      "# Compute normalized normal, put it in R1\n"
      "DP3 R1, f[TEX0], f[TEX0]; \n"
      "RSQ R1.y, R1.x;\n"
      "MUL R1, f[TEX0], R1.y;\n"

      "# Compute dot product of light direction and normal vector\n"
      "DP3_SAT R2, R0, R1;"

      "MUL R3, Diffuse, R2;    # diffuse attenuation\n"

      "POW R4, R2.x, {20.0}.x; # specular exponent\n"

      "MUL R5, Specular, R4;   # specular attenuation\n"

      "ADD o[COLR], R3, R5;    # add diffuse and specular colors\n"
      "END \n"
      ;

   static const char *vertProgramText =
      "!!VP1.0\n"
      "# typical modelview/projection transform\n"
      "DP4   o[HPOS].x, c[0], v[OPOS] ;\n"
      "DP4   o[HPOS].y, c[1], v[OPOS] ;\n"
      "DP4   o[HPOS].z, c[2], v[OPOS] ;\n"
      "DP4   o[HPOS].w, c[3], v[OPOS] ;\n"
      "# transform normal by inv transpose of modelview, put in tex0\n"
      "DP3   o[TEX0].x, c[4], v[NRML] ;\n"
      "DP3   o[TEX0].y, c[5], v[NRML] ;\n"
      "DP3   o[TEX0].z, c[6], v[NRML] ;\n"
      "DP3   o[TEX0].w, c[7], v[NRML] ;\n"
      "END\n";
   ;

   if (!glutExtensionSupported("GL_NV_vertex_program")) {
      printf("Sorry, this demo requires GL_NV_vertex_program\n");
      exit(1);
   }
   if (!glutExtensionSupported("GL_NV_fragment_program")) {
      printf("Sorry, this demo requires GL_NV_fragment_program\n");
      exit(1);
   }
         
   glGenProgramsNV(1, &FragProg);
   assert(FragProg > 0);
   glGenProgramsNV(1, &VertProg);
   assert(VertProg > 0);

   /*
    * Fragment program
    */
   glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, FragProg,
                   strlen(fragProgramText),
                   (const GLubyte *) fragProgramText);
   assert(glIsProgramNV(FragProg));
   glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, FragProg);

   NAMED_PARAMETER4FV(FragProg, "Diffuse", Diffuse);
   NAMED_PARAMETER4FV(FragProg, "Specular", Specular);

   /*
    * Vertex program
    */
   glLoadProgramNV(GL_VERTEX_PROGRAM_NV, VertProg,
                   strlen(vertProgramText),
                   (const GLubyte *) vertProgramText);
   assert(glIsProgramNV(VertProg));
   glBindProgramNV(GL_VERTEX_PROGRAM_NV, VertProg);
   glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
   glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4, GL_MODELVIEW, GL_INVERSE_TRANSPOSE_NV);

   /*
    * Misc init
    */
   glClearColor(0.3, 0.3, 0.3, 0.0);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHT0);
   glEnable(GL_LIGHTING);
   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse);
   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular);
   glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.0);

   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
   printf("Press p to toggle between per-pixel and per-vertex lighting\n");
}
예제 #7
0
//Set up openGL
bool GLInit()
{
	//set viewport
	int height = 480;
	int width = 640;

	
	glViewport(0, 0, width, height);					//reset viewport

	//set up projection matrix
	glMatrixMode(GL_PROJECTION);							//select projection matrix
	glLoadIdentity();										//reset
	gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f);
	
	//load identity modelview
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	//other states
	//shading
	glShadeModel(GL_SMOOTH);
	glClearColor(	backgroundColor.r,
					backgroundColor.g,
					backgroundColor.b,
					backgroundColor.a);
	glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

	//depth
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);

	//hints
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

	//Set up vertex arrays for torus
	//Fixed 17th November 2002
	//Instead of passing tangents as texture coords 1 and 2, use aliased attributes 9 and 10.
	//This way, these texture coordinates will reach the vertex program on a geforce 2
	//which only has 2 texture units.
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3, GL_FLOAT, sizeof(TORUS_VERTEX), &torus.vertices[0].position);

	glEnableClientState(GL_NORMAL_ARRAY);
	glNormalPointer(GL_FLOAT, sizeof(TORUS_VERTEX), &torus.vertices[0].normal);

	//Pass texture coords to unit 0
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glTexCoordPointer(2, GL_FLOAT, sizeof(TORUS_VERTEX), &torus.vertices[0].s);

	//Pass tangent,binormal to attributes 9, 10
	glEnableClientState(GL_VERTEX_ATTRIB_ARRAY9_NV);
	glVertexAttribPointerNV(9, 3, GL_FLOAT, sizeof(TORUS_VERTEX), &torus.vertices[0].sTangent);
	
	glEnableClientState(GL_VERTEX_ATTRIB_ARRAY10_NV);
	glVertexAttribPointerNV(10, 3, GL_FLOAT, sizeof(TORUS_VERTEX), &torus.vertices[0].tTangent);
	
	//Use compiled vertex arrays
	glLockArraysEXT(0, torus.numVertices);


	//Load vertex programs
	glGenProgramsNV(1, &singlePassVertexProgram);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, singlePassVertexProgram);
	LoadNV_vertex_program("single pass vertex program.txt", singlePassVertexProgram);

	glGenProgramsNV(1, &diffuseDecalVertexProgram);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, diffuseDecalVertexProgram);
	LoadNV_vertex_program("diffuse decal vertex program.txt", diffuseDecalVertexProgram);

	glGenProgramsNV(1, &lookUpSpecularVertexProgram);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, lookUpSpecularVertexProgram);
	LoadNV_vertex_program("look up specular vertex program.txt", lookUpSpecularVertexProgram);

	glGenProgramsNV(1, &diffuseVertexProgram);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, diffuseVertexProgram);
	LoadNV_vertex_program("diffuse vertex program.txt", diffuseVertexProgram);
	
	glGenProgramsNV(1, &decalVertexProgram);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, decalVertexProgram);
	LoadNV_vertex_program("decal vertex program.txt", decalVertexProgram);

	glGenProgramsNV(1, &simpleSpecularVertexProgram);
	glBindProgramNV(GL_VERTEX_PROGRAM_NV, simpleSpecularVertexProgram);
	LoadNV_vertex_program("simple specular vertex program.txt", simpleSpecularVertexProgram);

	//Set Tracking Matrix
	//Modelview Projection in registers c[0]-c[3]
	glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);

	return true;
}