📄 commonhw.cpp
字号:
// CommonHW.cpp: implementation of the CCommon class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Shadow.h"
#include "CommonHW.h"
#include "FragmentProgram.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
LARGE_INTEGER startcounter, endcounter, frequency;
float time_cost;
//////////////////////////////////////////////////////////////////////
//// Load in the fragment files before computations in detail.
//// NOTE:
//// But be sure it is called after OpenGL initialization and PBuffer
//// initialization
//// Latest Date: 2003/12/3
//////////////////////////////////////////////////////////////////////
FragmentShaderID GlobeShaderID[50];
void LoadFragmentProgramFiles()
{
int k=0;
//////////////////////////////////////////////////////
//strcpy(GlobeShaderID[CL_VECT_ADD_VECT_2D].FileName, "..\\add.fp");
//strcpy(GlobeShaderID[CL_VECT_SUB_VECT_2D].FileName, "..\\sub.fp");
//strcpy(GlobeShaderID[CL_VECT_MULT_VECT_2D].FileName, "..\\mul.fp");
//strcpy(GlobeShaderID[CL_VECT_MAX_2D].FileName, "..\\max.fp");
//strcpy(GlobeShaderID[CL_VECT_MIN_2D].FileName, "..\\min.fp");
//strcpy(GlobeShaderID[CL_VECT_NORMAL_2D].FileName, "..\\normal.fp");
//strcpy(GlobeShaderID[CL_DENSE_MAT_VECT_2D].FileName, "..\\matvector.fp");
strcpy(GlobeShaderID[CL_VECT_ADD_VECT_RECT].FileName, "..\\addRECT.fp");
strcpy(GlobeShaderID[CL_VECT_SUB_VECT_RECT].FileName, "..\\subRECT.fp");
strcpy(GlobeShaderID[CL_VECT_MULT_VECT_RECT].FileName, "..\\mulRECT.fp");
strcpy(GlobeShaderID[CL_VECT_MAX_RECT].FileName, "..\\maxRECT.fp");
strcpy(GlobeShaderID[CL_VECT_MIN_RECT].FileName, "..\\minRECT.fp");
strcpy(GlobeShaderID[CL_VECT_NORMAL_RECT].FileName, "..\\normalRECT.fp");
strcpy(GlobeShaderID[CL_DENSE_MAT_VECT_RECT].FileName, "..\\matvectorRECT.fp");
strcpy(GlobeShaderID[CL_MULTI_DENSE_MAT_VECT_RECT].FileName, "..\\matvectorRECTMulti.fp");
strcpy(GlobeShaderID[CL_MULTI_DENSE_MAT_VECT_MULTITEX_RECT].FileName, "..\\matvectorRECTMultiMultiTex.fp");
strcpy(GlobeShaderID[CL_MULTI_BOLZ_SPARSE_MAT_VECT].FileName, "..\\MultiBolzmatvectorRECT.fp");
strcpy(GlobeShaderID[CL_MULTI_BOLZ_SPARSE_MAT_VECT_LAST].FileName, "..\\MultiBolzmatvectorRECTLast.fp");
strcpy(GlobeShaderID[CL_BOLZ_SPARSE_MAT_VECT].FileName, "..\\BolzmatvectorRECT.fp");
strcpy(GlobeShaderID[CL_BOLZ_SPARSE_MAT_VECT_LAST].FileName, "..\\BolzmatvectorRECTLast.fp");
strcpy(GlobeShaderID[CL_BROOK_SPARSE_MAT_VECT].FileName, "..\\SDmatvectorRECT.fp");
strcpy(GlobeShaderID[CL_MULTI_BROOK_SPARSE_MAT_VECT].FileName, "..\\MultiSDmatvectorRECT.fp");
strcpy(GlobeShaderID[CL_KRUGER_SPARSE_MAT_VECT].FileName, "..\\ssmatrixvectorRECT.fp");
strcpy(GlobeShaderID[CL_SORT_VECTOR_RECT].FileName, "..\\BitonicSortRECT.fp");
int MaxShaderNum = 17;
for(k=0;k<MaxShaderNum;k++)
LoadFragmentProgramFromFile(GlobeShaderID[k].FileName, GlobeShaderID[k].ShaderID);
return;
}
XMaxResourceStruct ResourceLimitOnCurrentHW;
void FindOutResourceLimitOnCurrentHW()
{
//Max number of fragment program
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &(ResourceLimitOnCurrentHW.MaxTexUnitsNum));
glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB , &(ResourceLimitOnCurrentHW.MaxTexCoordsNum));
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB , &(ResourceLimitOnCurrentHW.MaxTexImageUnitsNum));
//Max number of vertex program
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxInstructionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeInstructionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxTemporariesNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeTemporariesNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxParametersNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeParametersNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxAttribsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxAttribsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxLocalParametersNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxEnvParametersNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxAluInstructionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxTexInstructionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxTexIndirectionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeAluInstructionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeTexInstructionsNum));
glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeTexIndirectionsNum));
//Max number of fragment program
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxInstructionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeInstructionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxTemporariesNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeTemporariesNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxParametersNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeParametersNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxAttribsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxAttribsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxLocalParametersNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxEnvParametersNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxAluInstructionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxTexInstructionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxTexIndirectionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeAluInstructionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeTexInstructionsNum));
glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeTexIndirectionsNum));
return;
}
/////////////////////////////////////////////////////////////////////
// determine the basic number of pow of 2
// for example, pow(n, 2) = x;
/////////////////////////////////////////////////////////////////////
int PowOf2(int x)
{
int n=0;
while(x>1)
{
x = x>>1;
n++;
}
return n;
}
//////////////////////////////////////////////////////////////////////
// x^2 >= TotalSize && x = 2^n
//////////////////////////////////////////////////////////////////////
int CalTexSize(const int TotalSize)
{
return (int)pow(2,ceil(log10(TotalSize)/log10(4)));
}
//////////////////////////////////////////////////////////////////////
/// One Dim -----> Two Dim
/// To find Optimized Texture Height & Width to min reduction
//////////////////////////////////////////////////////////////////////
void CalOptTexRSize(const int TotalSize, int& Height, int& Width)
{
Height = floor(sqrt(TotalSize));
Width = ceil((double)TotalSize/(double)Height);
return;
}
//////////////////////////////////////////////////////////////////////
/// One Dim -----> Two Dim
/// To find Optimized Texture Height & Width to min reduction
//////////////////////////////////////////////////////////////////////
void CalOptTexRGBASize(const int TotalSize, int& Height, int& Width)
{
int size = ceil((double)TotalSize/4);
Height = floor(sqrt(size));
Width = ceil((double)size/(double)Height);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -