我需要将bin文件转换为opengl纹理并将其显示在mfc中 [英] I need to convert a bin file to opengl texture and display it in mfc

查看:54
本文介绍了我需要将bin文件转换为opengl纹理并将其显示在mfc中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将bin文件转换为opengl纹理并在MFC中显示它。我使用下面的代码。我尝试了glTexParameterf而不是glTexParameteri,GL_LINEAR而不是GL_NEAREST并且使用了GL_REPEAT而不是GL_CLAMP但没有用。



我尝试了什么: < br $>


I want to convert a bin file into opengl texture and display it in MFC. I used the below code. I tried glTexParameterf instead of glTexParameteri,GL_LINEAR instead of GL_NEAREST and used GL_REPEAT instead of GL_CLAMP but no use.

What I have tried:

char* chBinBuffer = NULL;
    BYTE* Bitmap_Data = NULL;
   
    chBinBuffer = new char[1280 *690 * 4];
	Bitmap_Data = new BYTE[1280 *690 * 4 ];

    TCHAR tchFileName[MAX_PATH];
    swprintf_s(tchFileName, _T("D:\\Bin Files\\InputData_1280_690.bin"));
    FILE* pFile = NULL;
    _wfopen_s(&pFile, tchFileName, _T("rb"));
    
    if(NULL != pFile)
    {
        fread(Bitmap_Data, 1280 *690 * 4 * sizeof( unsigned char ), 1, pFile);
        fclose(pFile);
    }

    GLuint glTexture;
    
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &glTexture);
    glBindTexture(GL_TEXTURE_2D, glTexture);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);    // select modulate to mix texture with color for shading
   // when texture area is small, bilinear filter the closest mipmap
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                     GL_NEAREST );
    // when texture area is large, bilinear filter the original
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

    // the texture wraps over at the edges (repeat)
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

   //  // build our texture mipmaps
   /* gluBuild2DMipmaps( GL_TEXTURE_2D, 3, 1280, 690,
                       GL_RGBA, GL_UNSIGNED_BYTE, Bitmap_Data );*/

    glTexImage2D(GL_TEXTURE_2D,0, GL_RGBA8, 1280, 690, 0, GL_RGBA, GL_UNSIGNED_BYTE, Bitmap_Data);
    //glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 1280, 690, GL_RGBA, GL_UNSIGNED_BYTE, Bitmap_Data );
    delete [] chBinBuffer;
	delete[] Bitmap_Data;
    //glDeleteTextures( 1, &glTexture );





但我没有得到任何输出。请帮助我。



But i didnt get any output. Please help me.

推荐答案

void CDisplayTextureDlg :: OnBnClickedOk()

{

GLuint glTexture;

glTexture = LoadTexture();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D,glTexture);

glBegin( GL_QUADS);

glTexCoord2d(0.0,0.0);

glVertex2d(0.0,0.0);

glTexCoord2d(1.0,0.0);

glVertex2d(1.0,0.0);

glTexCoord2d(1.0,1.0);

glVertex2d(1.0,1.0);

glTexCoord2d(0.0,1.0);

glVertex2d( 0.0,1.0);

glEnd();

SwapBuffers(m_hDeviceContext);



// CDialogEx: :OnOK();

}





GLuint CDisplayTextureDlg :: LoadTexture()

{

char * pchBinBuffer = NULL;

BYTE * bData = NULL;



pchBinBuffer =新字符[nWIDTH * nHEIGHT * nPIXEL];

bData = new BYTE [nWIDTH * nHEIGHT * nPIXEL];



TCHAR tchFileName [MAX_PATH ];

swprintf_s(tchFileName,_T(D:\\Bin Files \\InputData_1280_690.bin));

FILE * pFile = NULL;

_wfopen_s(&pFile,tchFileName,_T(rb));



if(NULL!= pFile)

{

fread(bData,nWIDTH * nHEIGHT * nPIXEL, 1,pFile);

// memset(bData,255,1280 * 690 * 3);

fclose(pFile);

}



GLuint glTexture;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



glMatrixMode(GL_PROJECTION);

glLoadIdentity();

// gluPerspective(30.0f,(GLfloat)640 /(GLfloat)480,0.3f,200.0f); < br $> b $ b

// glMatrixMode(GL_MODELVIEW); //选择Modelview矩阵

// glLoadIdentity();

glEnable(GL_TEXTURE_2D);

glGenTextures(1,&glTexture);

glBindTexture(GL_TEXTURE_2D,glTexture);



glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); //选择调制以混合纹理和颜色进行着色

//当纹理区域很小时,双线性过滤最近的mipmap

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,

GL_NEAREST);

//当纹理区域很大时,双线性过滤原始的

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);



//纹理在边缘包裹(重复)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D ,GL_TEXTURE_WRAP_T,GL_CLAMP);

// gluBuild2DMipmaps(GL_TEXTURE_2D,1,nWIDTH,nHEIGHT,GL_RGBA8,GL_UNSIGNED_BYTE,bData);

glTexImage2D(GL_TEXTURE_2D,0,1,nWIDTH ,nHEIGHT,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,bData);



delete [] pchBinBuffer;

delete [] bData;



返回glTexture;

}



void CDisplayTextureDlg :: Initialize(void)

{

PIXELFORMATDESCRIPTOR pfd;

memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR));



pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);

pfd.cColorBits = 8 ;

pfd.cDepthBits = 16;

pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.nVersion = 1;



CClientDC dc(这);;
m_hDeviceContext = dc.GetSafeHdc();

int nPixelFormat = ChoosePixelFormat(m_hDeviceContext,&pfd);

SetPixelFormat(m_hDeviceContext,nPixelFormat, &pfd);

m_hRenderContext = wglCreateContext(m_hDeviceContext);

wglMakeCurrent(m_hDeviceContext,m_hRenderContext);

glClearColor(2.0f,2.0f,2.0 f,0.0f);

glClearDepth(0.0f);

OnBnClickedOk();

}
void CDisplayTextureDlg::OnBnClickedOk()
{
GLuint glTexture;
glTexture = LoadTexture();
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, glTexture );
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0);
glVertex2d(0.0,0.0);
glTexCoord2d(1.0,0.0);
glVertex2d(1.0,0.0);
glTexCoord2d(1.0,1.0);
glVertex2d(1.0,1.0);
glTexCoord2d(0.0,1.0);
glVertex2d(0.0,1.0);
glEnd();
SwapBuffers(m_hDeviceContext);

// CDialogEx::OnOK();
}


GLuint CDisplayTextureDlg :: LoadTexture()
{
char* pchBinBuffer = NULL;
BYTE* bData = NULL;

pchBinBuffer = new char[nWIDTH *nHEIGHT * nPIXEL];
bData = new BYTE[nWIDTH *nHEIGHT * nPIXEL ];

TCHAR tchFileName[MAX_PATH];
swprintf_s(tchFileName, _T("D:\\Bin Files\\InputData_1280_690.bin"));
FILE* pFile = NULL;
_wfopen_s(&pFile, tchFileName, _T("rb"));

if(NULL != pFile)
{
fread(bData, nWIDTH *nHEIGHT * nPIXEL , 1, pFile);
// memset( bData, 255, 1280 *690 * 3 );
fclose(pFile);
}

GLuint glTexture ;
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
// gluPerspective(30.0f,(GLfloat)640/(GLfloat)480,0.3f,200.0f);

// glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
// glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &glTexture);
glBindTexture(GL_TEXTURE_2D, glTexture);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); // select modulate to mix texture with color for shading
// when texture area is small, bilinear filter the closest mipmap
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST );
// when texture area is large, bilinear filter the original
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

// the texture wraps over at the edges (repeat)
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
// gluBuild2DMipmaps( GL_TEXTURE_2D, 1, nWIDTH, nHEIGHT, GL_RGBA8, GL_UNSIGNED_BYTE, bData );
glTexImage2D(GL_TEXTURE_2D,0, 1 , nWIDTH, nHEIGHT, 0, GL_LUMINANCE , GL_UNSIGNED_BYTE, bData);

delete [] pchBinBuffer;
delete[] bData;

return glTexture;
}

void CDisplayTextureDlg::Initialize(void)
{
PIXELFORMATDESCRIPTOR pfd ;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));

pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.cColorBits = 8;
pfd.cDepthBits = 16;
pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER ;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.nVersion = 1;

CClientDC dc(this);
m_hDeviceContext = dc.GetSafeHdc();
int nPixelFormat = ChoosePixelFormat(m_hDeviceContext, &pfd);
SetPixelFormat(m_hDeviceContext,nPixelFormat, &pfd);
m_hRenderContext = wglCreateContext(m_hDeviceContext);
wglMakeCurrent(m_hDeviceContext, m_hRenderContext);
glClearColor(2.0f, 2.0f, 2.0f, 0.0f);
glClearDepth(0.0f);
OnBnClickedOk();
}


这篇关于我需要将bin文件转换为opengl纹理并将其显示在mfc中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆