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