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

📄 fftengine.cpp

📁 选自<gpu gemes 2>,用gpu实现快速傅立叶变换
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************
*        FILE NAME:  FFTEngine.cpp
*
* ONE LINE SUMMARY:
*        This file contains some of the member function for the FFT class,
*        containing OpenGL commands.
*        
*        Thilaka Sumanaweera
*        Siemens Medical Solutions USA, Inc.
*        1230 Shorebird Way
*        Mountain View, CA 94039
*        USA
*        Thilaka.Sumanaweera@siemens.com
*
* DESCRIPTION:
*
*****************************************************************************
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
****************************************************************************/
#include <math.h>
#include <fstream>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "FFT.h"

using namespace std;

/*************************[MAN-BEG]*****************************************
*
* NAME:
*	FFT::UploadData
*
* DESCRIPTION:
*	Uploads the floating point data into the VRAM.
*
* FORMAL PARAMETERS:
*	(imageR1, imageI1) and (imageR2, imageI2) are two complex 2D input images.
*
* RETURNS:
*	none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::UploadData(float *imageR1, float *imageI1, float *imageR2, float *imageI2)
{
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texReal1);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, imageR1);

	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texImag1);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, imageI1);
	
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texReal2);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, imageR2);

	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texImag2);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, imageI2);
}

/*************************[MAN-BEG]*****************************************
*
* NAME:
*	FFT::InitTextures
*
* DESCRIPTION:
*	Initializes all the textures needed.
*
* FORMAL PARAMETERS:
*	none
*
* RETURNS:
*	none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::InitTextures(void)
{
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glGenTextures(1, &texTmpR1);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texTmpR1);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);
	
    glGenTextures(1, &texTmpI1);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texTmpI1);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);
	
    glGenTextures(1, &texTmpR2);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texTmpR2);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);
	
    glGenTextures(1, &texTmpI2);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texTmpI2);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);

	glGenTextures(1, &texReal1);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texReal1);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);

	glGenTextures(1, &texImag1);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texImag1);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);
	
	glGenTextures(1, &texReal2);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texReal2);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);

	glGenTextures(1, &texImag2);
	glBindTexture(GL_TEXTURE_RECTANGLE_NV, texImag2);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, Height, 0, GL_RED, GL_FLOAT, NULL);

	int i;
	glGenTextures(nButterfliesX, texButterflyLookupI_X);
	glGenTextures(nButterfliesX, texButterflyLookupWR_X);
	glGenTextures(nButterfliesX, texButterflyLookupWI_X);
	GLuint *Iptr0, *Iptr2, *Iptr3;
	GLfloat *Fptr0, *Fptr2, *Fptr3;
	Iptr0 = texButterflyLookupI_X;
	Iptr2 = texButterflyLookupWR_X;
	Iptr3 = texButterflyLookupWI_X;

	Fptr0 = butterflyLookupI_X;
	Fptr2 = butterflyLookupWR_X;
	Fptr3 = butterflyLookupWI_X;
	for (i = 0; i < nButterfliesX; i++) {
		glBindTexture(GL_TEXTURE_RECTANGLE_NV, *Iptr0);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_LUMINANCE_ALPHA_FLOAT16_ATI, Width, 1, 0, GL_LUMINANCE_ALPHA, GL_FLOAT, Fptr0);
		Iptr0++;
		Fptr0 += Width*2;

		glBindTexture(GL_TEXTURE_RECTANGLE_NV, *Iptr2);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, 1, 0, GL_RED, GL_FLOAT, Fptr2);
		Iptr2++;
		Fptr2 += Width;
		
		glBindTexture(GL_TEXTURE_RECTANGLE_NV, *Iptr3);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, Width, 1, 0, GL_RED, GL_FLOAT, Fptr3);
		Iptr3++;
		Fptr3 += Width;
	}
	
	glGenTextures(nButterfliesY, texButterflyLookupI_Y);
	glGenTextures(nButterfliesY, texButterflyLookupWR_Y);
	glGenTextures(nButterfliesY, texButterflyLookupWI_Y);

	Iptr0 = texButterflyLookupI_Y;
	Iptr2 = texButterflyLookupWR_Y;
	Iptr3 = texButterflyLookupWI_Y;

	Fptr0 = butterflyLookupI_Y;
	Fptr2 = butterflyLookupWR_Y;
	Fptr3 = butterflyLookupWI_Y;

	for (i = 0; i < nButterfliesY; i++) {
		glBindTexture(GL_TEXTURE_RECTANGLE_NV, *Iptr0);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_LUMINANCE_ALPHA_FLOAT16_ATI, 1, Height, 0, GL_LUMINANCE_ALPHA, GL_FLOAT, Fptr0);
		Iptr0++;
		Fptr0 += Height*2;
		
		glBindTexture(GL_TEXTURE_RECTANGLE_NV, *Iptr2);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, 1, Height, 0, GL_RED, GL_FLOAT, Fptr2);
		Iptr2++;
		Fptr2 += Height;
		
		glBindTexture(GL_TEXTURE_RECTANGLE_NV, *Iptr3);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, 1, Height, 0, GL_RED, GL_FLOAT, Fptr3);
		Iptr3++;
		Fptr3 += Height;
	}
	GenQuadDisplayList();

	GenDisplayListsX();
	GenDisplayListsY();

}

/*************************[MAN-BEG]*****************************************
*
* NAME:
*   FFT::CopyFloatBuffersToScreen
*
* DESCRIPTION:
*	Displays *Texs on the screen.
*
* FORMAL PARAMETERS:
*	FromInput_p:			true if you want to display the input textures
*							false if you want to display what is in the draw buffers
*	WinWidth:				window width
*	WinHeight:				window height
*	Texs:					contains (texR1, texI1, texR2, texI2)
*
* RETURNS:
*   none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::CopyFloatBuffersToScreen(bool FromInput_p, int WinWidth, int WinHeight, GLuint* Texs)
{
	if (!FromInput_p) Buffers->PingForDisplay(Texs);

	glDrawBuffer(GL_BACK_LEFT);
	glViewport(0, 0, WinWidth, WinHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, Width, 0.0, Height);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

	cgGLSetTextureParameter(DispTexR1, Texs[0]);
	CheckCgError();
	cgGLSetTextureParameter(DispTexI1, Texs[1]);
	CheckCgError();
	cgGLSetTextureParameter(DispTexR2, Texs[2]);
	CheckCgError();
	cgGLSetTextureParameter(DispTexI2, Texs[3]);
	CheckCgError();
	EnableDispFragmentProgram();

	glEnable(GL_TEXTURE_RECTANGLE_NV);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0, 0.0);
	glVertex2f(0.0, 0.0);
	glTexCoord2f(Width, 0.0);
	glVertex2f(Width, 0.0);
	glTexCoord2f(Width, Height);
	glVertex2f(Width, Height);
	glTexCoord2f(0.0, Height);
	glVertex2f(0.0, Height);
	glEnd();
	glDisable(GL_TEXTURE_RECTANGLE_NV);

	DisableDispFragmentProgram();

	if (!FromInput_p) Buffers->Pong(false);
}

/*************************[MAN-BEG]*****************************************
*
* NAME:
*	FFT::DisplayInputImage
*
* DESCRIPTION:
*	Displays the textures bound to (texReal1, texImag1) and 
*	(texReal2, texImag2).
*
* FORMAL PARAMETERS:
*	WinWidth:  width of the window
*	WinHeight: height of the window
*
* RETURNS:
*	none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::DisplayInputImage(int WinWidth, int WinHeight)
{
	cgGLSetParameter4fv(DispInvEnergy, InvMax);
	CheckCgError();

	GLuint Texs[4];
	bool FromInput_p = true;
	SetTexs(Texs, texReal1, texImag1, texReal2, texImag2);
	CopyFloatBuffersToScreen(FromInput_p, WinWidth, WinHeight, Texs);
}

/*************************[MAN-BEG]*****************************************
*
* NAME:
*	FFT::DisplayInputImage
*
* DESCRIPTION:
*	Displays the textures bound to (texTmpR1, texTmpI1) and
*	(texTmpR2, texTmpI2).
*
* FORMAL PARAMETERS:
*	WinWidth:  width of the window
*	WinHeight: height of the window
*
* RETURNS:
*	none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::DisplayOutputImage(int WinWidth, int WinHeight)
{	
	cgGLSetParameter4fv(DispInvEnergy, InvEnergy);
	CheckCgError();

	GLuint Texs[4];
	bool FromInput_p = false;
	SetTexs(Texs, texTmpR1, texTmpI1, texTmpR2, texTmpI2);
	CopyFloatBuffersToScreen(FromInput_p, WinWidth, WinHeight, Texs);
}

/*************************[MAN-BEG]*****************************************
*
* NAME:
*	FFT::RenderFFTStageX
*
* DESCRIPTION:
*	Binds various textures, binds draw buffers and renders a quad or a
*	series of quads depending on the method (method 1 or method 2), for
*	doing FFT in x.
*
* FORMAL PARAMETERS:
*	FirstTime_p:			true if running for the first time
*	texButterflyLookupI:	lookup table containing scrambled coordinates
*	texButterflyLookupWR:	lookup table containing weights, real part.
*	texButterflyLookupWI:	lookup table containing weights, real part.
*	Texs:					contains (texR1, texI1, texR2, texI2)
*
* RETURNS:
*	none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::RenderFFTStageX(bool FirstTime_p,
						  int texButterflyLookupI,  
						  int texButterflyLookupWR,  
						  int texButterflyLookupWI, 
						  GLuint *Texs)
{
	Buffers->Ping(FirstTime_p, Texs);

    glViewport(0, 0, Width, Height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, Width, 0.0, Height);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
	
	// Check to see we are doing method 1 or method 2
	if (CurrentButterflyStage < xCutOff) {
		cgGLSetTextureParameter(xButterflyLookupI_1, texButterflyLookupI);
		CheckCgError();
		cgGLSetTextureParameter(xButterflyLookupWR_1, texButterflyLookupWR);
		CheckCgError();
		cgGLSetTextureParameter(xButterflyLookupWI_1, texButterflyLookupWI);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexR1_1, Texs[0]);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexI1_1, Texs[1]);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexR2_1, Texs[2]);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexI2_1, Texs[3]);
		CheckCgError();
	}
	else {
		cgGLSetTextureParameter(xBaseTexR1_2, Texs[0]);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexI1_2, Texs[1]);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexR2_2, Texs[2]);
		CheckCgError();
		cgGLSetTextureParameter(xBaseTexI2_2, Texs[3]);
		CheckCgError();
	}

	EnableFFTFragmentProgramX();
	if (CurrentButterflyStage < xCutOff) {
		// Debugging using immediate mode
		// DrawQuadForFFT();
		// Using display lists
		DrawQuadForFFT_List();
	}
	else {
		// Debugging using immediate mode
		// DrawQuadTilesForFFT_X();
		// Using display lists
		DrawQuadTilesForFFT_X_List();
	}
	DisableFFTFragmentProgramX();

	Buffers->Pong(FirstTime_p);
	Buffers->Swap();
}

/*************************[MAN-BEG]*****************************************
*
* NAME:
*	FFT::RenderFFTStageY
*
* DESCRIPTION:
*	Binds various textures, binds draw buffers and renders a quad or a
*	series of quads depending on the method (method 1 or method 2), for
*	doing FFT in y.
*
* FORMAL PARAMETERS:
*	FirstTime_p:			true if running for the first time
*	texButterflyLookupI:	lookup table containing scrambled coordinates
*	texButterflyLookupWR:	lookup table containing weights, real part.
*	texButterflyLookupWI:	lookup table containing weights, real part.
*	Texs:					contains (texR1, texI1, texR2, texI2)
*
* RETURNS:
*	none
*
* REVISION HISTORY:
* Rev     When      Who         What
* V1      15Dec2004 Thilaka     Created.
**************************[MAN-END]*****************************************/
void FFT::RenderFFTStageY(bool FirstTime_p,
						  int texButterflyLookupI,  
						  int texButterflyLookupWR,  
						  int texButterflyLookupWI,
						  GLuint *Texs)
{
	Buffers->Ping(FirstTime_p, Texs);

	glViewport(0, 0, Width, Height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, Width, 0.0, Height);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
	
	// Check to see we are doing method 1 or method 2
	if (CurrentButterflyStage < yCutOff) {
		cgGLSetTextureParameter(yButterflyLookupI_1, texButterflyLookupI);
		CheckCgError();
		cgGLSetTextureParameter(yButterflyLookupWR_1, texButterflyLookupWR);
		CheckCgError();
		cgGLSetTextureParameter(yButterflyLookupWI_1, texButterflyLookupWI);
		CheckCgError();
		cgGLSetTextureParameter(yBaseTexR1_1, Texs[0]);
		CheckCgError();
		cgGLSetTextureParameter(yBaseTexI1_1, Texs[1]);
		CheckCgError();

⌨️ 快捷键说明

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