示例#1
0
文件: brush.c 项目: johnh530/electro
void init_brush(int i)
{
    struct brush *b = get_brush(i);

    if (b->state == 0)
    {
        int p;

        /* Initialize and vertex and fragment shaders and uniforms. */

        if (GL_has_shader_objects)
        {
            if (b->vert_text)
                b->vert_shad = opengl_shader_object(GL_VERTEX_SHADER_ARB,
                                                    b->vert_text);
            if (b->frag_text)
                b->frag_shad = opengl_shader_object(GL_FRAGMENT_SHADER_ARB,
                                                    b->frag_text);
            if (b->vert_shad || b->frag_shad)
                b->shad_prog = opengl_program_object(b->vert_shad,
                                                     b->frag_shad);

            if (b->shad_prog && b->uniform)
                for (p = 0; p < vecnum(b->uniform); ++p)
                    use_uniform(b, (struct uniform *) vecget(b->uniform, p));
        }

        /* Initialize any vertex program and parameters. */

        if (b->vert && GL_has_vertex_program)
        {
            b->vert_prog = opengl_vert_prog(b->vert);

            for (p = 0; p < MAX_PARAM; ++p)
                glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,
                                              p, b->vert_param[p]);
        }

        /* Initialize any fragment program and parameters. */

        if (b->frag && GL_has_fragment_program)
        {
            b->frag_prog = opengl_frag_prog(b->frag);

            for (p = 0; p < MAX_PARAM; ++p)
                glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB,
                                              p, b->frag_param[p]);
        }

        b->state = 1;
    }
}
示例#2
0
文件: arbfvp.c 项目: jckarter/Trixel
static void
arbfvp_draw_from_brick(trixel_state t, trixel_brick * brick)
{
    struct arbfvp_shaders * shaders = ARBFVP(t);
    
    glEnable(GL_VERTEX_PROGRAM_ARB);
    glEnable(GL_FRAGMENT_PROGRAM_ARB);
    glBindProgramARB(GL_VERTEX_PROGRAM_ARB, shaders->vertex_program);
    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shaders->fragment_program);
    
    glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, ARBFVP_VERTEX_VOXMAP_SIZE_INV,  (GLfloat*)&brick->dimensions_inv);
    glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, ARBFVP_VERTEX_NORMAL_SCALE,     (GLfloat*)&brick->normal_scale);
    glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, ARBFVP_VERTEX_NORMAL_TRANSLATE, (GLfloat*)&brick->normal_translate);
}
void APIENTRY _my_glProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat* params)
{
	for ( int i=0; i<count; i++ )
	{
		glProgramLocalParameter4fvARB(target, index+i, params + 4*i);
	}
}
示例#4
0
文件: arbfvp.c 项目: jckarter/Trixel
static void
arbfvp_set_light_param(trixel_state t, GLuint light, int param, GLfloat * value)
{
    // XXX multiple lights?
    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, ARBFVP(t)->fragment_program);
    glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, param, value);
    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
}
示例#5
0
/*
====================
BindForViewOrigin
====================
*/
void idMegaTexture::BindForViewOrigin( const idVec3 viewOrigin ) {

	SetViewOrigin( viewOrigin );

	// borderClamp image goes in texture 0
	//GL_SelectTexture( 0 );
	globalImages->borderClampImage->Bind(0);

	// level images in higher textures, blurriest first
	for ( int i = 0 ; i < 7 ; i++ ) {
		//GL_SelectTexture( 1+i );

		if ( i >= numLevels ) {
			globalImages->whiteImage->Bind( 1+i );

			static float	parms[4] = { -2, -2, 0, 1 };	// no contribution
			glProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, i, parms );
		} else {
			idTextureLevel	*level = &levels[ numLevels-1-i ];

			if ( r_showMegaTexture.GetBool() ) {
				if ( i & 1 ) {
					globalImages->blackImage->Bind( 1+i );
				} else {
					globalImages->whiteImage->Bind( 1+i );
				}
			} else {
				level->image->Bind( 1+i );
			}
			glProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, i, level->parms );
		}
	}

	float	parms[4];
	parms[0] = 0;
	parms[1] = 0;
	parms[2] = 0;
	parms[3] = 1;
	glProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 7, parms );

	parms[0] = 1;
	parms[1] = 1;
	parms[2] = r_terrainScale.GetFloat();
	parms[3] = 1;
	glProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, 8, parms );
}
示例#6
0
void GPUProgram::BindingTable::arbBind(GLenum target) const {
    for (int b = 0; b < bindingArray.size(); ++b) {
        const Binding& binding = bindingArray[b];

        if ((binding.source == CONSTANT) && (binding.type == FLOAT4)) {
            glProgramLocalParameter4fvARB(target, binding.slot, binding.vector);
        }
    }
}
示例#7
0
void GPUProgram::loadConstant(int slot, const Vector4& value) const {
    switch (extension) {
    case NVIDIA:
        glProgramParameter4fvNV(unit, slot, value);
        break;

    case ARB:
        glProgramLocalParameter4fvARB(unit, slot, value);
        break;
    }
}
示例#8
0
void GLArbGpuProgram::bindProgramPassIterationParameters(GpuProgramParametersSharedPtr params)
{
    if (params->hasPassIterationNumber())
    {
		GLenum type = getGLShaderType(mType);

		size_t physicalIndex = params->getPassIterationNumberIndex();
		size_t logicalIndex = params->getFloatLogicalIndexForPhysicalIndex(physicalIndex);
		const float* pFloat = params->getFloatPointer(physicalIndex);
        glProgramLocalParameter4fvARB(type, (GLuint)logicalIndex, pFloat);
    }

}
示例#9
0
文件: brush.c 项目: johnh530/electro
void recv_set_brush_vert_param(void)
{
    struct brush *b = get_brush(recv_index());
    int           p = recv_index();

    recv_array(b->vert_param[p], 4, sizeof (float));

    if (b->vert_prog && GL_has_vertex_program)
    {
        glBindProgramARB(GL_VERTEX_PROGRAM_ARB, b->vert_prog);
        glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,
                                      p, b->vert_param[p]);
    }
}
示例#10
0
文件: brush.c 项目: johnh530/electro
void recv_set_brush_frag_param(void)
{
    struct brush *b = get_brush(recv_index());
    int           p = recv_index();

    recv_array(b->frag_param[p], 4, sizeof (float));

    if (b->frag_prog && GL_has_fragment_program)
    {
        glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, b->frag_prog);
        glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB,
                                      p, b->frag_param[p]);
    }
}
示例#11
0
文件: brush.c 项目: johnh530/electro
void send_set_brush_vert_param(int i, int p, const float v[4])
{
    struct brush *b = get_brush(i);

    b->vert_param[p][0] = v[0];
    b->vert_param[p][1] = v[1];
    b->vert_param[p][2] = v[2];
    b->vert_param[p][3] = v[3];

    send_event(EVENT_SET_BRUSH_VERT_PARAM);
    send_index(i);
    send_index(p);
    send_array(b->vert_param[p], 4, sizeof (float));

    if (b->vert_prog && GL_has_vertex_program)
    {
        glBindProgramARB(GL_VERTEX_PROGRAM_ARB, b->vert_prog);
        glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,
                                      p, b->vert_param[p]);
    }
}
示例#12
0
void GLArbGpuProgram::bindProgramParameters(GpuProgramParametersSharedPtr params, uint16 mask)
{
    GLenum type = getGLShaderType(mType);
    
	// only supports float constants
	GpuLogicalBufferStructPtr floatStruct = params->getFloatLogicalBufferStruct();

	for (GpuLogicalIndexUseMap::const_iterator i = floatStruct->map.begin();
		i != floatStruct->map.end(); ++i)
	{
		if (i->second.variability & mask)
		{
			size_t logicalIndex = i->first;
			const float* pFloat = params->getFloatPointer(i->second.physicalIndex);
			// Iterate over the params, set in 4-float chunks (low-level)
			for (size_t j = 0; j < i->second.currentSize; j+=4)
			{
				glProgramLocalParameter4fvARB(type, logicalIndex, pFloat);
				pFloat += 4;
				++logicalIndex;
			}
		}
	}
}
示例#13
0
void
VertexProgramTest::setup(void)
{
	// setup Infinity, Nan values
	int nan;
	float *nanPtr;

	nan = (0xff << 23) | (1 << 0);
	nanPtr = (float *) &nan;
	InfNan[0] = HUGE_VAL;
	InfNan[1] = -HUGE_VAL;
	InfNan[2] = (float) (*nanPtr);
	InfNan[3] = 1.0 / HUGE_VAL;
	/*
	printf("InfNan = %f %f %f %f\n",
	       InfNan[0], InfNan[1], InfNan[2], InfNan[3]);
	*/

	glGenProgramsARB(1, &progID);
	glBindProgramARB(GL_VERTEX_PROGRAM_ARB, progID);
	glEnable(GL_VERTEX_PROGRAM_ARB);

	// load program inputs
	glColor4fv(VertColor);
	glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 0, Param0);
	glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 1, Param1);
	glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 2, Param2);
	glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 9, InfNan);

	// other GL state
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, Diffuse);
	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, VertColor);
	glFogf(GL_FOG_DENSITY, FogDensity);
	glFogf(GL_FOG_START, FogStart);
	glFogf(GL_FOG_END, FogEnd);

	GLenum err = glGetError();
	assert(!err);  // should be OK

	// setup vertex transform (we'll draw a quad in middle of window)
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-4.0, 4.0, -4.0, 4.0, 0.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glDrawBuffer(GL_FRONT);
	glReadBuffer(GL_FRONT); 

	// compute error tolerances (may need fine-tuning)
	int bufferBits[5];
	glGetIntegerv(GL_RED_BITS, &bufferBits[0]);
	glGetIntegerv(GL_GREEN_BITS, &bufferBits[1]);
	glGetIntegerv(GL_BLUE_BITS, &bufferBits[2]);
	glGetIntegerv(GL_ALPHA_BITS, &bufferBits[3]);
	glGetIntegerv(GL_DEPTH_BITS, &bufferBits[4]);

	tolerance[0] = 2.0 / (1 << bufferBits[0]);
	tolerance[1] = 2.0 / (1 << bufferBits[1]);
	tolerance[2] = 2.0 / (1 << bufferBits[2]);
	if (bufferBits[3])
		tolerance[3] = 2.0 / (1 << bufferBits[3]);
	else
		tolerance[3] = 1.0;
	if (bufferBits[4])
		tolerance[4] = 16.0 / (1 << bufferBits[4]);
	else
		tolerance[4] = 1.0;

        // Some tests request a looser tolerance:
        // XXX a factor of 4 may be too much...
        for (int i = 0; i < 5; i++)
                looseTolerance[i] = 4.0 * tolerance[i];
}
示例#14
0
void Viewer::renderModel()
{
	glBindProgramARB( GL_VERTEX_PROGRAM_ARB, m_vertexProgramId );

	glEnableVertexAttribArrayARB(0);
	glEnableVertexAttribArrayARB(1);
    glEnableVertexAttribArrayARB(2);
	glEnableVertexAttribArrayARB(3);
    glEnableVertexAttribArrayARB(8);
	
	glEnable(GL_TEXTURE_2D);
	// set global OpenGL states
	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_SMOOTH);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);		
	glEnable(GL_VERTEX_PROGRAM_ARB);
	

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferObject[0]);
	glVertexAttribPointerARB(0, 3 , GL_FLOAT, false, 0, NULL);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferObject[1]);
	glVertexAttribPointerARB(1, 4 , GL_FLOAT, false, 0, NULL);

	glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferObject[2]);
    glVertexAttribPointerARB(2, 3 , GL_FLOAT, false, 0, NULL);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferObject[3]);

	glVertexAttribPointerARB(3, 4 , GL_FLOAT, false, 0, NULL);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferObject[4]);
	glVertexAttribPointerARB(8, 2 , GL_FLOAT, false, 0, NULL);

	glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_bufferObject[5]);
	
		
	int hardwareMeshId;
	
	for(hardwareMeshId=0;hardwareMeshId<m_calHardwareModel->getHardwareMeshCount() ; hardwareMeshId++)
	{
		m_calHardwareModel->selectHardwareMesh(hardwareMeshId);

		unsigned char meshColor[4];	
		float materialColor[4];
		// set the material ambient color
		m_calHardwareModel->getAmbientColor(&meshColor[0]);
		materialColor[0] = meshColor[0] / 255.0f;  materialColor[1] = meshColor[1] / 255.0f; materialColor[2] = meshColor[2] / 255.0f; materialColor[3] = meshColor[3] / 255.0f;
		glMaterialfv(GL_FRONT, GL_AMBIENT, materialColor);
		
		// set the material diffuse color
		m_calHardwareModel->getDiffuseColor(&meshColor[0]);
		materialColor[0] = meshColor[0] / 255.0f;  materialColor[1] = meshColor[1] / 255.0f; materialColor[2] = meshColor[2] / 255.0f; materialColor[3] = meshColor[3] / 255.0f;
		glMaterialfv(GL_FRONT, GL_DIFFUSE, materialColor);
		
		// set the material specular color
		m_calHardwareModel->getSpecularColor(&meshColor[0]);
		materialColor[0] = meshColor[0] / 255.0f;  materialColor[1] = meshColor[1] / 255.0f; materialColor[2] = meshColor[2] / 255.0f; materialColor[3] = meshColor[3] / 255.0f;
		glMaterialfv(GL_FRONT, GL_SPECULAR, materialColor);
		
		// set the material shininess factor
		float shininess;
		shininess = 50.0f; //m_calHardwareModel->getShininess();
		glMaterialfv(GL_FRONT, GL_SHININESS, &shininess);

		int boneId;
		for(boneId = 0; boneId < m_calHardwareModel->getBoneCount(); boneId++)
		{
			CalQuaternion rotationBoneSpace = m_calHardwareModel->getRotationBoneSpace(boneId, m_calModel->getSkeleton());
			CalVector translationBoneSpace = m_calHardwareModel->getTranslationBoneSpace(boneId, m_calModel->getSkeleton());

			CalMatrix rotationMatrix = rotationBoneSpace;

			float transformation[12];

			transformation[0]=rotationMatrix.dxdx;transformation[1]=rotationMatrix.dxdy;transformation[2]=rotationMatrix.dxdz;transformation[3]=translationBoneSpace.x;
			transformation[4]=rotationMatrix.dydx;transformation[5]=rotationMatrix.dydy;transformation[6]=rotationMatrix.dydz;transformation[7]=translationBoneSpace.y;
			transformation[8]=rotationMatrix.dzdx;transformation[9]=rotationMatrix.dzdy;transformation[10]=rotationMatrix.dzdz;transformation[11]=translationBoneSpace.z;

			
			glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,boneId*3,&transformation[0]);
			glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,boneId*3+1,&transformation[4]);
			glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,boneId*3+2,&transformation[8]);			
			
            // set the texture id we stored in the map user data
            glBindTexture(GL_TEXTURE_2D, (GLuint)(size_t)m_calHardwareModel->getMapUserData(0));
		}

		if(sizeof(CalIndex)==2)
			glDrawElements(GL_TRIANGLES, m_calHardwareModel->getFaceCount() * 3, GL_UNSIGNED_SHORT, (((CalIndex *)NULL)+ m_calHardwareModel->getStartIndex()));
		else
			glDrawElements(GL_TRIANGLES, m_calHardwareModel->getFaceCount() * 3, GL_UNSIGNED_INT, (((CalIndex *)NULL)+ m_calHardwareModel->getStartIndex()));
		

	}

    // clear vertex array state    

	glDisableVertexAttribArrayARB(0);
	glDisableVertexAttribArrayARB(1);
    glDisableVertexAttribArrayARB(2);
	glDisableVertexAttribArrayARB(3);
    glDisableVertexAttribArrayARB(8);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
	glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);

    // clear light
    glDisable(GL_LIGHTING);
    glDisable(GL_LIGHT0);
    glDisable(GL_DEPTH_TEST);
	glDisable(GL_VERTEX_PROGRAM_ARB);


	glBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 );

}
示例#15
0
		inline void FragmentProgram::localParameter(GLuint index, const math::Matrix<4, 1, float> &vec)
		{
			glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, index,	&vec[0]);
		}
示例#16
0
		inline void VertexProgram::localParameter(GLuint index, const math::Matrix<4, 1, float> &vec)
		{
			glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, index,	&vec[0]);
		}
/////////////////////////////////////////////////////////
// Render
//
void GEMglProgramLocalParameter4fvARB :: render(GemState *state) {
	glProgramLocalParameter4fvARB (target, index, params);
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramLocalParameter4fvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) {
	const GLfloat *params_address = (const GLfloat *)(intptr_t)params;
	glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB = (glProgramLocalParameter4fvARBPROC)((intptr_t)function_pointer);
	glProgramLocalParameter4fvARB(target, index, params_address);
}
示例#19
0
PIGLIT_GL_TEST_CONFIG_END

void
piglit_init(int argc, char **argv)
{
	const char *source =
		"!!ARBvp1.0\n"
		"OPTION ARB_position_invariant;\n"
		"MOV result.color, program.local[3];\n"
		"END\n";
	GLuint prog;
	GLint max_local;
	GLint i;

	piglit_require_extension("GL_ARB_vertex_program");

	prog = piglit_compile_program(GL_VERTEX_PROGRAM_ARB, source);
	glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog);

	glGetProgramivARB(GL_VERTEX_PROGRAM_ARB,
			  GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &max_local);

	/* Limit the test to blowing through 256MB of memory. */
	max_local = MIN2(max_local, 1024 * 1024 * 16);

	for (i = 0; i < max_local; i++) {
		float values[4];

		values[0] = i * 4;
		values[1] = i * 4 + 1;
		values[2] = i * 4 + 2;
		values[3] = i * 4 + 3;

		glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, values);
	}

	for (i = 0; i < max_local; i++) {
		float values[4], get_values[4];

		glGetProgramLocalParameterfvARB(GL_VERTEX_PROGRAM_ARB, i,
						get_values);

		values[0] = i * 4;
		values[1] = i * 4 + 1;
		values[2] = i * 4 + 2;
		values[3] = i * 4 + 3;

		if (memcmp(values, get_values, sizeof(values)) != 0) {
			fprintf(stderr, "Difference on "
				"glGetProgramLocalParameterfvARB(%d):\n", i);
			fprintf(stderr, "expected: %f %f %f %f\n",
				values[0],
				values[1],
				values[2],
				values[3]);
			fprintf(stderr, "found:    %f %f %f %f\n",
				get_values[0],
				get_values[1],
				get_values[2],
				get_values[3]);
			piglit_report_result(PIGLIT_FAIL);
		}
	}

	piglit_report_result(PIGLIT_PASS);
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramLocalParameter4fvARB(JNIEnv *env, jclass clazz, jint target, jint index, jobject params, jint params_position, jlong function_pointer) {
	const GLfloat *params_address = ((const GLfloat *)(*env)->GetDirectBufferAddress(env, params)) + params_position;
	glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB = (glProgramLocalParameter4fvARBPROC)((intptr_t)function_pointer);
	glProgramLocalParameter4fvARB(target, index, params_address);
}
示例#21
0
static void DoFrame(void)
{
	static float Local[3][4] = {
		{ 1.0, 0.8, 1.0, 1.0 },
		{ 0.5, 0.5, 0.5, 1.0 },
		{ 1.0, 0.0, 0.0, 1.0 }
	};
	static float Local2[3][4] = {
		{ 0.8, 1.0, 1.0, 1.0 },
		{ 0.5, 0.5, 0.5, 1.0 },
		{ 1.0, 0.0, 1.0, 1.0 }
	};
	int i;

	glClearColor(0.8, 0.8, 0.8, 0.8);
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, TexDiffuse);
	glEnable(GL_TEXTURE_2D);

	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, TexNormal);
	glEnable(GL_TEXTURE_2D);

	glActiveTexture(GL_TEXTURE2);
	glBindTexture(GL_TEXTURE_2D, TexSpecular);
	glEnable(GL_TEXTURE_2D);

	glActiveTexture(GL_TEXTURE3);
	glBindTexture(GL_TEXTURE_2D, TexLookup);
	glEnable(GL_TEXTURE_2D);

	glActiveTexture(GL_TEXTURE4);
	glBindTexture(GL_TEXTURE_2D, TexLookup);
	glEnable(GL_TEXTURE_2D);

	glActiveTexture(GL_TEXTURE5);
	glBindTexture(GL_TEXTURE_2D, TexLookup);
	glEnable(GL_TEXTURE_2D);

	glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
	glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
	glMultiTexCoord2f(GL_TEXTURE2, 0.0, 0.0);
	glMultiTexCoord3f(GL_TEXTURE3, 0.0, 0.05, 0.25);
	glMultiTexCoord3f(GL_TEXTURE4, 4, -3, 0);
	glMultiTexCoord3f(GL_TEXTURE5, 0, 3, 4);

	glEnable(GL_FRAGMENT_PROGRAM_ARB);
	for(i = 0; i < 3; ++i)
		glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, Local[i]);

	glBegin(GL_QUADS);
		glVertex2f(0.75, 0.75);
		glVertex2f(0.25, 0.75);
		glVertex2f(0.25, 0.25);
		glVertex2f(0.75, 0.25);
	glEnd();

	glEnable(GL_FRAGMENT_PROGRAM_ARB);
	for(i = 0; i < 3; ++i)
		glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, Local2[i]);

	glBegin(GL_QUADS);
		glVertex2f(1.75, 0.75);
		glVertex2f(1.25, 0.75);
		glVertex2f(1.25, 0.25);
		glVertex2f(1.75, 0.25);
	glEnd();
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexProgram_nglProgramLocalParameter4fvARB__IIJ(JNIEnv *__env, jclass clazz, jint target, jint index, jlong paramsAddress) {
    glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB = (glProgramLocalParameter4fvARBPROC)tlsGetFunction(1387);
    intptr_t params = (intptr_t)paramsAddress;
    UNUSED_PARAM(clazz)
    glProgramLocalParameter4fvARB(target, index, params);
}
示例#23
0
void Shader::bind() {
	if(old_shader != this) {
		if(vertex_target == GL_VERTEX_PROGRAM_ARB) glBindProgramARB(vertex_target,vertex_id);
		if(fragment_target == GL_FRAGMENT_PROGRAM_ARB) glBindProgramARB(fragment_target,fragment_id);
		else if(fragment_target == GL_FRAGMENT_PROGRAM_NV) glBindProgramNV(fragment_target,fragment_id);
		else if(fragment_target == GL_COMBINE) glCallList(fragment_id);
		old_shader = this;
	}
	for(int i = 0; i < num_matrixes; i++) {
		glMatrixMode(GL_MATRIX0_ARB + matrixes[i].num);
		if(matrixes[i].type == PROJECTION) glLoadMatrixf(Engine::projection);
		else if(matrixes[i].type == MODELVIEW) glLoadMatrixf(Engine::modelview);
		else if(matrixes[i].type == IMODELVIEW) glLoadMatrixf(Engine::imodelview);
		else if(matrixes[i].type == TRANSFORM) glLoadMatrixf(Engine::transform);
		else if(matrixes[i].type == ITRANSFORM) glLoadMatrixf(Engine::itransform);
		else if(matrixes[i].type == LIGHT_TRANSFORM && Engine::current_light) glLoadMatrixf(Engine::current_light->transform);
	}
	if(num_matrixes) glMatrixMode(GL_MODELVIEW);
	for(int i = 0; i < num_vertex_parameters; i++) {
		if(vertex_parameters[i].type == TIME) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(Engine::time,Engine::time / 2.0f,Engine::time / 3.0f,Engine::time / 5.0f));
		else if(vertex_parameters[i].type == SIN) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(sin(Engine::time),sin(Engine::time / 2.0f),sin(Engine::time / 3.0f),sin(Engine::time / 5.0f)));
		else if(vertex_parameters[i].type == COS) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(cos(Engine::time),cos(Engine::time / 2.0f),cos(Engine::time / 3.0f),cos(Engine::time / 5.0f)));
		else if(vertex_parameters[i].type == CAMERA) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(Engine::camera,1));
		else if(vertex_parameters[i].type == ICAMERA) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(Engine::itransform * Engine::camera,1));
		else if(vertex_parameters[i].type == LIGHT) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,Engine::light);
		else if(vertex_parameters[i].type == ILIGHT) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(Engine::itransform * vec3(Engine::light),Engine::light.w));
		else if(vertex_parameters[i].type == LIGHT_COLOR) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,Engine::light_color);
		else if(vertex_parameters[i].type == FOG_COLOR) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,Engine::fog_color);
		else if(vertex_parameters[i].type == VIEWPORT) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,vec4(Engine::viewport[0],Engine::viewport[1],Engine::viewport[2],Engine::viewport[3]));
		else if(vertex_parameters[i].type == PARAMETER) glProgramLocalParameter4fvARB(vertex_target,vertex_parameters[i].num,parameters[vertex_parameters[i].parameter]);
	}
	for(int i = 0; i < num_fragment_parameters; i++) {
		if(vertex_parameters[i].type == TIME) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(Engine::time,Engine::time / 2.0f,Engine::time / 3.0f,Engine::time / 5.0f));
		else if(vertex_parameters[i].type == SIN) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(sin(Engine::time),sin(Engine::time / 2.0f),sin(Engine::time / 3.0f),sin(Engine::time / 5.0f)));
		else if(vertex_parameters[i].type == COS) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(cos(Engine::time),cos(Engine::time / 2.0f),cos(Engine::time / 3.0f),cos(Engine::time / 5.0f)));
		else if(fragment_parameters[i].type == CAMERA) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(Engine::camera,1));
		else if(fragment_parameters[i].type == ICAMERA) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(Engine::itransform * Engine::camera,1));
		else if(fragment_parameters[i].type == LIGHT) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,Engine::light);
		else if(fragment_parameters[i].type == ILIGHT) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(Engine::itransform * vec3(Engine::light),Engine::light.w));
		else if(fragment_parameters[i].type == LIGHT_COLOR) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,Engine::light_color);
		else if(fragment_parameters[i].type == FOG_COLOR) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,Engine::fog_color);
		else if(fragment_parameters[i].type == VIEWPORT) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,vec4(Engine::viewport[0],Engine::viewport[1],Engine::viewport[2],Engine::viewport[3]));
		else if(fragment_parameters[i].type == PARAMETER) glProgramLocalParameter4fvARB(fragment_target,fragment_parameters[i].num,parameters[fragment_parameters[i].parameter]);
	}
}