📄 vectorvectoroperation.cpp
字号:
// 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 + -