⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vectorvectoroperation.cpp

📁 PDE simulator on GPU.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// VectorVectorOperation.cpp: implementation of the VectorVectorOperation class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "shadow.h"
#include "VectorOnGPU.h"
#include "VectorVectorOperation.h"

#include "pbuffer.h"
#include "FragmentProgram.h"
#include "CommonHW.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

///////////////////////////////////////////////////////////////////////////////////////
/// General-Purpose Computation with GPU
/// Author: Youquan Liu
/// Website: http://lcs.ios.ac.cn/~lyq/
/// Date:   2003/8/4
/// Modified: 2003/12/4
/// Location: Labatory of Computer Science, Institute of Software, 
///            Chinese Academy of Sciences, P.R.China
/// The FOLLOWING is the BASIC ALGEBRA OPERATION ON GPU with Register Combiner
/// Date: 2003/8/26
/// Latest Modified Date: 2003/10/23
/// Vector(result) = a Vector(x) op b Vector(y)
/// Support TEX_2D & TEX_RECTANGLE
////////////////////////////////////////////////////////////////////////////////////////
void clVecOp(OperationOnGPUEnum op, const float a, const float b, const CVectorOnGPU& x, const CVectorOnGPU& y, CVectorOnGPU& result)
{
	int i;
	//////////////////////////////////////////////
	///If the size is compatible, then error occurs
	if(x.GetVectorLength() != y.GetVectorLength())
	{
		AfxMessageBox("Error to Operate on these two vectors for different size!");
		return;
	}

	////////////Determine the Texture TARGET
	unsigned int _iTextureTarget = x.GetTextureTarget();
	int Width  = x.GetWidth();
	int Height = x.GetHeight(); 
	float fTexCoord[2];
	if(_iTextureTarget == GL_TEXTURE_2D)
	{
		fTexCoord[0] = 1.0;
		fTexCoord[1] = 1.0;
	}
	else
	{
		fTexCoord[0] = Width;
		fTexCoord[1] = Height;
	}
	//// Add coefficiences
	GLfloat Va[4],Vb[4];
	for(i=0;i<4;i++)
	{
		Va[i] = a;
		Vb[i] = b;
	}

	//////////////////////////////////////////////
	///// Clear the framebuffer firstly to avoid the previous computation
	///// This step is important to avoid computation errors
	//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
	//glDisable(GL_DEPTH_TEST);
/*
	unsigned int IndexArray[4] = {0,1,2,3};
	int VertexArray[8];
	int TextureArray[8];
	VertexArray[0] = 0;			TextureArray[0] = 0;
	VertexArray[1] = 0;			TextureArray[1] = 0;
	VertexArray[2] = Width;     TextureArray[2] = fTexCoord[0];
	VertexArray[3] = 0;			TextureArray[3] = 0;
	VertexArray[4] = Width;     TextureArray[4] = fTexCoord[0];
	VertexArray[5] = Height;    TextureArray[5] = fTexCoord[1];
	VertexArray[6] = 0;         TextureArray[6] = 0;
	VertexArray[7] = Height;    TextureArray[7] = fTexCoord[1];

	glEnableClientState ( GL_VERTEX_ARRAY );   
	glVertexPointer(2, GL_INT, 0, VertexArray);
*/
	////////////////////////////////////////////// 
	///x
	glActiveTextureARB(GL_TEXTURE0_ARB);
	glEnable(_iTextureTarget);
	glBindTexture(_iTextureTarget, x.GetTextureID());
	//glEnableClientState( GL_TEXTURE_COORD_ARRAY );
	//glTexCoordPointer(2, GL_INT, 0, TextureArray);
	//////////////////////////////////////////////
	///y
	glActiveTextureARB(GL_TEXTURE1_ARB);
	glEnable(_iTextureTarget);
    glBindTexture(_iTextureTarget, y.GetTextureID());
	//glEnableClientState( GL_TEXTURE_COORD_ARRAY );
	//glTexCoordPointer(2, GL_INT, 0, TextureArray);

	glEnable(GL_REGISTER_COMBINERS_NV);
	glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 1);

    ////The Following NOT work, maybe should be GL_COMBINER0_NV instead of GL_COMBINER1_NV
	////Still NOT work
	//glCombinerStageParameterfvNV(GL_COMBINER0_NV, GL_CONSTANT_COLOR0_NV, Va);
    //glCombinerStageParameterfvNV(GL_COMBINER0_NV, GL_CONSTANT_COLOR1_NV, Vb);
	
	////But this WORK
	glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, Va);
	glCombinerParameterfvNV(GL_CONSTANT_COLOR1_NV, Vb);

	switch(op)
	{
		case CL_VECT_ADD_VECT_RECT://///TEX0+TEX1
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV, 
				               GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
			
			if(x.GetChannelsNum() == 4)
			{
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				
				glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
								   GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
			}
			break;
		case CL_VECT_SUB_VECT_RECT://///TEX0-TEX1
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_TEXTURE1_ARB, GL_SIGNED_NEGATE_NV, GL_RGB);
			glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV, 
				               GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);

			if(x.GetChannelsNum() == 4)
			{
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_TEXTURE1_ARB, GL_SIGNED_NEGATE_NV, GL_ALPHA);
				glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
				               GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);					
			}
			break;
		case CL_VECT_MULT_VECT_RECT://///TEX0*TEX1
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB, GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV, 
				               GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
			
			////// Still problem here to calculate correctly just for every fourth component(alpha)
			if(x.GetChannelsNum() == 4)
			{
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_TEXTURE1_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA, GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV, 
								   GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
				/*
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_CONSTANT_COLOR1_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA, GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV, 
								   GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);

				glCombinerInputNV(GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerInputNV(GL_COMBINER1_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
				glCombinerOutputNV(GL_COMBINER1_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
				               GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);	
				*/
			}

			glFinalCombinerInputNV(GL_VARIABLE_A_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glFinalCombinerInputNV(GL_VARIABLE_C_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glFinalCombinerInputNV(GL_VARIABLE_D_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glFinalCombinerInputNV(GL_VARIABLE_E_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
			glFinalCombinerInputNV(GL_VARIABLE_F_NV, GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);			
			break;
		default:
			AfxMessageBox("Error Operation Type in clVecOp!");
			exit(0);
	}
//	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, IndexArray);

	glBegin( GL_QUADS );
		glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0, 0);	
		glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0, 0);	
		glVertex2i( 0, 0);

		glMultiTexCoord2fARB(GL_TEXTURE0_ARB, fTexCoord[0], 0);
		glMultiTexCoord2fARB(GL_TEXTURE1_ARB, fTexCoord[0], 0);	
		glVertex2i( Width, 0);

		glMultiTexCoord2fARB(GL_TEXTURE0_ARB, fTexCoord[0], fTexCoord[1]);
		glMultiTexCoord2fARB(GL_TEXTURE1_ARB, fTexCoord[0], fTexCoord[1]);	
		glVertex2i( Width, Height);

		glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0, fTexCoord[1]);
		glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0, fTexCoord[1]);	
		glVertex2i( 0, Height);
	glEnd();

	glDisable(GL_REGISTER_COMBINERS_NV);	

    // Now we need to copy the resulting pixels into the output
	// save the result texture into result
    glBindTexture(_iTextureTarget, result.GetTextureID());
    glCopyTexSubImage2D(_iTextureTarget, 0, 0, 0, 0, 0, Width, Height);

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -